GCC 警告:ISO C 不允许命名可变参数宏
使用以下命令
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 我不确定我是否需要对此过于担心,但我真的不喜欢警告。我缺少什么标志?
Using the following command
gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o rootTESTOBJECT
I get the compiler warning
root.h:76:22: warning: ISO C does not permit named variadic macros
72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...)
77 #endif
I believe the option
-ansi -std=c99
allows the use of variadic macros, it does according to the docs anyway...
I have tried editing line 76 to
76 #define crumb(phrase0...) printf("")
to see if this fixed the warning but with no joy.
the compiler verion is Apple's gcc, version 4.2.1
I'm not sure if I need be too concerned by this but I really don't like warnings. What flag's am I missing ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
#define crumb(phrase0...)
为变量参数 (...
) 指定名称 (phrase0
) 。这是一个 GCC 扩展。
C99 确实定义了一种传递变量参数的方法到宏(参见§6.10.3/12和§6.10.3.1/2):变量参数是未命名的
在定义的左侧(即
...
),并在右侧引用为__VA_ARGS__
,如下所示:(顺便说一下,您的
gcc
参数不应同时包含-ansi
和-std=c99
:-ansi
指定早期的 C 标准(也称为 ANSI C、C89 或C90); 在这种情况下,两个选项的组合只会选择 C99,因为在参数列表中-std=c99
出现在-ansi
之后。 ,最后一个获胜。)#define crumb(phrase0...) <whatever>
is giving a name (phrase0
) to the variable arguments (...
).This is a GCC extension.
C99 does define a way of passing variable arguments to macros (see §6.10.3/12 and §6.10.3.1/2): the variable arguments are unnamed
on the left-hand side of the definitions (i.e. just
...
), and referenced on the right-hand side as__VA_ARGS__
, like this:(By the way, your
gcc
arguments should not include both-ansi
and-std=c99
:-ansi
specifies the earlier C standard (known variously as ANSI C, C89 or C90); the combination of both options only happens to select C99 in this case because-std=c99
appears after-ansi
in the argument list, and the last one wins.)