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

时间:2011-07-19 16:18:38

标签: gcc gcc-warning

使用以下命令

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

我收到编译器警告     root.h:76:22:警告: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("")

看看这是否修复了警告,但没有任何欢乐。

编译器版本是Apple的gcc,版本4.2.1 我不确定我是否需要过于担心,但我真的不喜欢警告。我错过了什么旗帜?

1 个答案:

答案 0 :(得分:20)

#define crumb(phrase0...) <whatever>为变量参数(phrase0)命名(...)。

这是GCC extension

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之后出现,最后一个获胜。)