使用以下命令
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在参数列表,最后一个获胜.)