#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)都不支持此命名的可变参数宏。但是它没有提供解决该警告的标准。
有很多方法可以避免此警告。
但是我不想做这3个事情中的任何一个。我想知道是否有可能使用命名的可变参数宏编写代码,然后为什么它会首先产生警告。并没有任何解决方案可以使代码干净并存?
哪个标准允许使用此类命名的可变参数宏?如果GCC希望在没有任何解决方案的情况下调用警告,那么为什么要首先创建警告?
答案 0 :(得分:0)
与标准C相比,GCC记录了其扩展名。它记录的内容之一是显示的变量参数列表宏扩展名:
它们是GCC标准;它们不是任何(其他)标准组织的标准。