使用以下命令
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 我不确定我是否需要过于担心,但我真的不喜欢警告。我错过了什么旗帜?
答案 0 :(得分:20)
#define crumb(phrase0...) <whatever>
为变量参数(phrase0
)命名(...
)。
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
之后出现,最后一个获胜。)