13

使用以下命令

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT

我收到编译器警告 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

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

我尝试将第 76 行编辑为

76 #define crumb(phrase0...) printf("")

看看这是否解决了警告但没有喜悦。

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

4

1 回答 1

23

#define crumb(phrase0...) <whatever>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参数列表中,最后一个获胜。)

于 2011-07-19T20:00:40.793 回答