c - 类函数宏和变量
问题描述
由于某些难以理解的原因,在我的代码中,我有类似的内容:
#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,讨论标准库函数及其作为类函数宏的潜在实现(除了作为函数的定义),说:
... 函数的任何宏定义都可以通过将函数的名称括在括号中来在本地抑制,因为名称后面没有表示宏函数名称扩展的左括号。出于同样的句法原因,即使库函数也被定义为宏,也允许获取库函数的地址……</p>
编译器可能会发出警告(尽管当宏名称是上面 C 标准所建议的库函数时,它可能希望抑制此警告),但 GCC 9.2 和 Clang 11.0.0 都不会这样做,即使启用了所有警告.
推荐阅读
- c - 我认为这个数组有问题,但我不知道是什么?
- flutter - 如果变量不为空,则将空值分配给数组
- javascript - Material UI 导入组件 makeStyles 冲突
- javascript - 当输入变量相同时,Apollo useQuery 不会进行网络调用
- python - 为什么整数不能识别为大于 0?
- swift - 在界面生成器中使用 SideMenu pod 时“此类不符合键值编码”
- c++ - 在 Visual Studio 2017 中为 Sapera 演示编译错误
- pandas - Pandas GroupBy- 删除少于 2 个项目的组
- python-3.x - 以不区分大小写的方式映射两个数据帧(Python pandas)
- c - qsort 比较函数能否始终返回非零值?