C 类似宏和变量的函数

C 类似宏和变量的函数,c,c-preprocessor,C,C Preprocessor,出于某些不可忽视的原因,在我的代码中,我有如下内容: #define pippo(x) printf("%d",x) ... ... many lines down in the code ... int pippo = 0; 相同的标识符pippo已用于类似宏的函数和变量名!除了在可怜的维护者身上可能出现的混乱之外,我想知道这是否符合标准 C99和C11(在6.10.3中)都表示: 10[…]函数的每个后续实例,如宏名称,后跟 (作为下一个预处理标记,将引入 预处理由中的替换列表替换的令牌

出于某些不可忽视的原因,在我的代码中,我有如下内容:

#define pippo(x) printf("%d",x)
...
... many lines down in the code
...
int pippo = 0;
相同的标识符
pippo
已用于类似宏的函数和变量名!除了在可怜的维护者身上可能出现的混乱之外,我想知道这是否符合标准

C99和C11(在6.10.3中)都表示:

10[…]函数的每个后续实例,如宏名称,后跟 (作为下一个预处理标记,将引入 预处理由中的替换列表替换的令牌 定义[……]

他们不说,如果宏名字的函数是<强> > < /强>,后面跟着一个‘(’),我担心一些编译器可能会认为这是一个错误(或者可能只发出警告)。


我是不是太担心了?

函数名的实例,如宏,后面不跟
不会被替换

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

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


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

5.1.1.2,第4点,指定如何“调用”预处理器,如果您愿意:

执行预处理指令,展开宏调用,然后 _执行Pragma一元运算符表达式。[…]然后删除所有预处理指令


因此,这意味着任何未被预处理器触及的内容都将被单独处理,包括任何未后跟
pippo

如果它编译了,你为什么要担心?但修复它肯定是更好的。好的新词,即:“不受约束!”(我会投票让你成为名誉格拉斯哥人。)@EugeneSh:即使某些东西被编译了,人们也会担心,因为有些bug不会阻止编译,而且某些东西可能在一个编译器中编译,而不是在另一个编译器中编译。