【问题标题】:GCC warning: ISO C does not permit named variadic macrosGCC 警告:ISO C 不允许命名可变参数宏
【发布时间】:2011-07-19 16:18:37
【问题描述】:

使用以下命令

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 我不确定我是否需要对此过于担心,但我真的不喜欢警告。我错过了什么标志?

【问题讨论】:

    标签: gcc gcc-warning


    【解决方案1】:

    #define crumb(phrase0...) &lt;whatever&gt; 正在为变量参数 (...) 命名 (phrase0)。

    这是GCC extension

    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 在参数列表中,最后一个获胜。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多