哪个C标准支持命名可变参数宏?

时间:2018-08-12 15:34:52

标签: c gcc coding-style warnings standards

#include <stdio.h>

#define A_NAMED_VARIADIC_MACRO(args...) printf(args)
#define A_ANONYMOUS_VARIADIC_MACRO(...) printf(__VA_ARGS__)

int main()
{
  A_NAMED_VARIADIC_MACRO("%s\r\n", "testing named variadic macro");
  A_ANONYMOUS_VARIADIC_MACRO("%s\r\n", "testing anonymous macro");

  return 0;
}

以上代码演示了可变参数宏(inspiration)的用法。您可以使用以下命令编译该程序并运行它:

gcc -o a.out prog.c

但是,如果您使用(默认)C标准(例如-std = c99)运行此命令,则可以使用以下命令来获取警告(如果有任何警告生成):

gcc -pedantic -o a.out prog.c

您将收到以下警告:

  

警告:ISO C不允许命名可变参数宏[-Wvariadic-macros]
       #define A_NAMED_VARIADIC_MACRO(args ...)printf(args)

从此警告消息中可以很明显地看出,采用的默认标准(即-std = something)都不支持此命名的可变参数宏。但是它没有提供解决该警告的标准。

有很多方法可以避免此警告。

  1. 不要通过-pedantic标志
  2. 请勿使用命名可变参数宏,而应将其替换为匿名宏
  3. 通过-Wno-variadic-macro抑制警告

但是我不想做这3个事情中的任何一个。我想知道是否有可能使用命名的可变参数宏编写代码,然后为什么它会首先产生警告。并没有任何解决方案可以使代码干净并存?

哪个标准允许使用此类命名的可变参数宏?如果GCC希望在没有任何解决方案的情况下调用警告,那么为什么要首先创建警告?

1 个答案:

答案 0 :(得分:0)

与标准C相比,GCC记录了其扩展名。它记录的内容之一是显示的变量参数列表宏扩展名:

它们是GCC标准;它们不是任何(其他)标准组织的标准。