在 C99 中,我们有复合文字,它们可以传递给函数,如下所示:
f((int[2]){ 1, 2 });
但是,如果f
不是函数而是类似函数的宏,gcc 会拒绝 this,因为预处理器将其解析为两个参数,而不是一个参数,“ (int[2]){ 1
”和“ 2 }
”。
这是 gcc 或 C 标准中的错误吗?如果是后者,那几乎排除了所有透明使用类似函数的宏,这似乎是一个巨大的缺陷......
编辑:作为一个例子,人们期望以下是一个符合标准的程序片段:
fgetc((FILE *[2]){ f1, f2 }[i]);
但是由于fgetc
可以实现为宏(尽管需要保护其参数并且不对其进行多次评估),因此该代码实际上是不正确的。这对我来说似乎很奇怪。