我知道我的问题类似于 this one或 this one ,但我发现它不是真的一样,而且,第二个没有接受答案,我决定问一下在调用类似函数的宏时添加预处理器指令是否正确?
就我而言,我有一个类似函数的宏:
#define FUNC_MACRO(a, b) // do something with the variables
如果定义了其他宏,我在代码中的某处调用它时会有所不同:
// ...
FUNC_MACRO(aVal
#ifdef ANOTHER_MACRO
+ offset
#endif // ANOTHER_MACRO
, bVal);
// ...
我在我的机器(linux,使用 gcc 4.8)上进行了测试,它工作正常(有和没有预处理器指令,有和没有定义 ANOTHER_MACRO),但是这样做安全吗?
我从第一个类似问题的答案中阅读了 16.3/9 段,但我的情况也是如此吗?
最佳答案
C 语言在 6.10.3 宏替换中将此作为未定义行为,¶11:
If there are sequences of preprocessing tokens within the list of arguments that would otherwise act as preprocessing directives, the behavior is undefined.
所以这样做确实是错误的。
GCC 和其他流行的编译器可能没有捕捉到它,这可能是该语言的许多用户不知道的原因。当我的一些代码在 PCC 上编译失败时我遇到了这个问题(并及时修复了我代码中的错误)。
更新:PJTraill 在评论中询问了在宏扩展中包含预处理器指令会“误导或无意义”的情况。这是一个明显的:
foo(a, b,
#ifdef BAR
c);
#else
d);
#endif
我不确定语言是否可以在宏扩展中指定 balanced 预处理器条件是可以的,但我认为你也会遇到歧义问题按照它们应该被处理的顺序。
关于c++ - 在类似函数的宏中添加预处理器指令是否错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534609/