首页 > 解决方案 > 类函数宏和变量

问题描述

由于某些难以理解的原因,在我的代码中,我有类似的内容:

#define pippo(x) printf("%d",x)
...
... many lines down in the code
...
int pippo = 0;

pippo类似函数的宏和变量名都使用了相同的标识符!除了在糟糕的维护者中可能出现的混乱之外,我想知道这是否符合标准。

C99 和 C11(在 6.10.3 中)都说:

10 [...] 每个后续实例的类函数宏名称后跟一个 ( 作为下一个预处理标记引入了由定义中的替换列表替换的预处理标记序列 [...]

他们没有说如果类似函数的宏名称后面没有'('会发生什么,我担心某些编译器可能会认为这是一个错误(或者可能只是发出警告)。

我是不是太担心了?

标签: cc-preprocessor

解决方案


没有后跟的类函数宏名称的实例(不会被替换。

因此,使用名称并不违反 C 标准中的约束。该标准甚至给出了使用这种行为的示例。C 2018 7.1.4 1,讨论标准库函数及其作为类函数宏的潜在实现(除了作为函数的定义),说:

... 函数的任何宏定义都可以通过将函数的名称括在括号中来在本地抑制,因为名称后面没有表示宏函数名称扩展的左括号。出于同样的句法原因,即使库函数也被定义为宏,也允许获取库函数的地址……</p>

编译器可能会发出警告(尽管当宏名称是上面 C 标准所建议的库函数时,它可能希望抑制此警告),但 GCC 9.2 和 Clang 11.0.0 都不会这样做,即使启用了所有警告.


推荐阅读