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

lbd*_*bdl 11 gcc gcc-warning

使用以下命令

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT
Run Code Online (Sandbox Code Playgroud)

我得到编译器警告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
Run Code Online (Sandbox Code Playgroud)

我相信选项-ansi -std = c99允许使用可变参数宏,无论如何它根据文档...

我已经尝试编辑76行了

76 #define crumb(phrase0...) printf("")
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ery 21

#define crumb(phrase0...) <whatever>phrase0变量arguments(...)一个name ().

这是GCC扩展.

C99确实定义了一种将变量参数传递给宏的方法(参见§6.10.3/ 12和§6.10.3.1/ 2):变量参数在定义的左侧未命名(即只是...),并引用于右边一样__VA_ARGS__,像这样:

#define crumb(...) printf(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,你的gcc论点不应该包括-ansi-std=c99: -ansi指定较早C标准(不同地称作ANSI C,C89或C90);两个选项的组合只发生在这种情况下,选择C99,因为-std=c99出现后, -ansi在参数列表,最后一个获胜.)