GCC警告:ISO C不允许使用命名可变参数宏

13

使用以下命令:

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT

我收到了编译器警告 root.h:76:22: warning: ISO C 不允许使用命名变参宏

72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...) 
77 #endif

我相信选项 -ansi -std=c99 允许使用可变参数宏,至少文档是这么说的...

我已经尝试将第76行编辑为

76 #define crumb(phrase0...) printf("")

我尝试了解决警告,但未成功。

编译器版本是苹果的gcc,版本为4.2.1。我不确定是否需要过于担心,但我真的不喜欢警告。我错过了哪些标志?

1个回答

23

#define crumb(phrase0...) <whatever> 将变长参数 (...) 赋予一个名称 (phrase0)。

这是 GCC 扩展

C99 确实定义了一种将变长参数传递给宏的方法 (参见 §6.10.3/12 和 §6.10.3.1/2):变长参数在定义的左侧无名(即只有 ...),在右侧称为 __VA_ARGS__,像这样:

#define crumb(...) printf(__VA_ARGS__)

顺便提一下,你的gcc参数不应该同时包含-ansi-std=c99-ansi指定了较早的C标准(也称为ANSI C、C89或C90);在参数列表中,两个选项的组合只会在这种情况下选择C99,因为-std=c99出现在-ansi之后,最后一个胜出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接