2012-01-27 138 views

回答

9

这是一个variadic macro

从链接页面引用逐字:

宏可以声明为接受可变数量的参数就像一个功能。定义宏的语法与函数的语法相似。下面是一个例子:

#define eprintf(...) fprintf (stderr, __VA_ARGS__) 

这种宏叫做variadic。当宏被调用时,其最后命名参数(该宏没有)后的参数列表中的所有标记(包括任何逗号)都将成为变量参数。无论它出现在哪里,这个令牌序列都会替换标识符为的VA_ARGS。因此,我们有这样的扩展:

eprintf ("%s:%d: ", input_file, lineno) 
     ==> fprintf (stderr, "%s:%d: ", input_file, lineno) 

而对于特定的形式,引用的页面进一步下跌:

如果宏是复杂的,你可能要为一个更具描述性的名称可变参数比__VA_ARGS__CPP允许这样做,作为扩展。你可以在`...'之前立即写出一个参数名称;该名称用于可变参数。该EPRINTF宏观上面可以写

#define eprintf(args...) fprintf (stderr, args) 
+0

很棒的答案,+1和一个勾号:D – perfwill 2012-01-27 10:19:25

3

可变数量的参数。见variadic macros

+0

但为何有一个“一”在那里,“......”过吗? – perfwill 2012-01-27 10:17:38

+1

@perfwill,这是为了方便起见,给它一个名字的语法。 – 2012-01-27 10:19:01

3

这是一个可变参数宏。

可变参数宏是一个接受可变数量参数的宏。该功能已在C99中引入。

形式

#define IDEBUG(a...) printf(a) 

与参数a...是GNU扩展,a给出一个名称__VA_ARGS__标识符。

C99标准形式是

#define IDEDBUG(...) printf(__VA_ARGS__)