类似函数的宏和变量

Rem*_*o.D 2 c c-preprocessor

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

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

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

C99 和 C11(在 6.10.3. 中)都说:

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

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

我是不是太担心了?

Eri*_*hil 6

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

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

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

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