在 C99 中,我们有复合文字,它们可以传递给函数,如下所示:
f((int[2]){ 1, 2 });
但是,如果 f
不是一个函数而是一个类似函数的宏,gcc 会对此感到厌烦,因为预处理器将其解析为两个参数而不是一个参数,“( int[2]){ 1
”和“2 }
”。
这是 gcc 或 C 标准中的错误吗?如果是后者,那几乎排除了所有透明使用类函数宏的可能性,这似乎是一个巨大的缺陷......
编辑:例如,人们希望以下内容是一个符合规范的程序片段:
fgetc((FILE *[2]){ f1, f2 }[i]);
但是由于 fgetc
可以作为一个宏来实现(尽管需要保护它的参数并且不对其求值超过一次),这段代码实际上是不正确的。这让我感到惊讶。
最佳答案
这个“错误”自 C89 以来就存在于标准中:
#include <stdio.h>
void function(int a) {
printf("%d\n", a);
}
#define macro(a) do { printf("%d\n", a); } while (0)
int main() {
function(1 ? 1, 2: 3); /* comma operator */
macro(1 ? 1, 2: 3); /* macro argument separator - invalid code */
return 0;
}
我实际上并没有通过标准来检查这个解析,我已经接受了 gcc 的话,但非正式地需要一个匹配的 :
到每个 ?
胜过运算符优先级和参数列表语法以使第一个语句有效。第二个就没有这样的运气了。
关于复合文字和类似函数的宏 : bug in gcc or the C standard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558159/