gpt4 book ai didi

C 预处理器 : Evaluate macro early

转载 作者:太空狗 更新时间:2023-10-29 16:37:56 27 4
gpt4 key购买 nike

考虑以下设置:

啊.h

#define A 5
#define B A
#undef A
#define A 3

交流

#include "a.h"
#include <stdio.h>

int main()
{
printf("%d\n", B);
return 0;
}

虽然这非常合理地打印 3,但有没有办法让它打印 5,即在 a.h 的第二行用 5 替换 A?

最佳答案

不,没有办法做到这一点。除非您知道 A 的所有可能值,并且它们总是整数,在这种情况下您可以费力地依次测试每个值:

#if A == 0
# define B 0
#elif A == 1
# define B 1
#elif A == 2
# define B 2
/* ... and a very long etc. */
#endif

如果您的用例仅涉及整数,则您有更多选择。例如,您可以将 B 声明为 static const intenum(取决于语言)而不是宏,这显然会使用宏的当前值。如果你真的想要宏,Boost 预处理库有一个 implementation上面费力的 #if 序列(巧妙地减少了 log(N) 而不是 N 所需的预处理器语句的数量)。


#define预处理器指令中没有宏替换; §6.10 段涵盖了这一事实。 C 标准的第 7 条(C++ 标准的第 16 段第 6 段,措辞相同):

The preprocessing tokens within a preprocessing directive are not subject to macro expansion unless otherwise stated.

#if#include 指令的描述中,标准规定确实会发生宏替换,这就是为什么#if 上面的解决方案有效(和 Boost 实现,它也使用计算的 #include)。

关于C 预处理器 : Evaluate macro early,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com