我知道我的问题与此或这一问题相似,但是我发现问题并不完全相同,此外,第二个问题还没有接受答案,我决定问何时添加预处理程序指令是否正确像函数一样的宏被称为?
就我而言,我有一个类似于函数的宏:
#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中将其保留为未定义的行为:
如果参数列表中有一些预处理令牌序列,否则它们将充当预处理指令,则该行为是未定义的。
所以确实这样做是错误的。
GCC和其他流行的编译器都无法识别它,这可能就是为什么许多这种语言的用户不知道的原因。当我的某些代码无法在PCC上编译时,我遇到了此问题(并立即修复了代码中的错误)。
更新:PJTraill在评论中询问了在宏扩展内包含预处理程序指令的情况是“令人误解或毫无意义”的情况。这是一个明显的例子:
foo(a, b,
#ifdef BAR
c);
#else
d);
#endif
我不确定用这种语言来指定宏扩展内平衡的预处理程序条件是否合理,但是我认为您在处理它们的顺序上也存在歧义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句