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

发布于 2024-11-24 22:44:12 字数 615 浏览 0 评论 0原文

使用以下命令

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

篱下浅笙歌 2024-12-01 22:44:12

#define crumb(phrase0...) 为变量参数 (...) 指定名称 (phrase0) 。

这是一个 GCC 扩展

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

#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:

#define crumb(...) printf(__VA_ARGS__)

(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.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文