为什么 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/