c - GNU cpp 是否奇怪地为零参数的宏解释 C99 标准?

标签 c macros gnu c99 c-preprocessor

为什么 GNU cpp 接受以下代码,即使在使用标志 -std=c99 -pedantic 运行时也是如此:

#define z()
#define w(x)
z()
w()
w(1)

C99 标准要求类函数宏调用中的参数数量应与宏定义中的参数数量相匹配(并且很高兴一个参数可能由预处理标记的空序列组成,因此大概前两个调用提供了一个空参数),但这不可能对所有三个调用都成立。

确实肯定只能用零参数调用 z,这在语法上是不可能的?

最佳答案

一些实验表明第一个 w 行被解释为一个空参数:

#define w(x) #x
w()
w(1)

当预处理给出:

""
"1"

更好的是:

#define w(x, y) #x <-> #y
w(,)
w(1,)
w(, 2)
w(1, 2)

给出:

"" <-> ""
"1" <-> ""
"" <-> "2"
"1" <-> "2"

漂亮...

不知道标准对此有何规定。必须问律师...

关于c - GNU cpp 是否奇怪地为零参数的宏解释 C99 标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021104/

相关文章:

c - 缓冲文件中的一组行并将其存储在 C 中的数组中

macros - 用英文字符替换土耳其字符

使用 C 预处理器指令检查编译时间

c++ - 在宏之间传递 __VA_ARGS__ 和 ##__VA_ARGS__ 有什么区别

linux - GNU Nano 对文件中的整数进行排序

c - 一个结构存储在另一个结构中

c - Linux 内核错误 : missing binary operator before token "("

c - 指向整数转换错误的不兼容指针

c++ - 使用 GNU C++ 为 Maya 编译时出现编译器错误

linker - 了解 GNU 链接描述文件的位置计数器