这个#define语法是什么意思?

时间:2012-01-27 10:14:28

标签: c c-preprocessor

我遇到过这一个,不明白。

#define IDEBUG(a...)  

“(a ...)”是什么意思?

3 个答案:

答案 0 :(得分:9)

那是variadic macro

从链接页面逐字引用:

  

宏可以被声明为接受可变数量的参数,就像函数一样。定义宏的语法类似于函数的语法。这是一个例子:

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

这种宏叫做可变参数。调用宏时,在最后一个命名参数(此宏没有)之后的参数列表中的所有标记(包括任何逗号)都将成为变量参数。这个令牌序列替换宏体中的标识符 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)

答案 1 :(得分:3)

可变数量的参数。见variadic macros

答案 2 :(得分:3)

这是一个可变的宏。

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

表格

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

参数a...是GNU扩展名,a__VA_ARGS__标识符命名。

标准C99表格将是

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