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

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

#define IDEBUG(a...) 

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

那是一个可变的宏 。

从链接页面逐字引用:

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

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

这种宏称为可变参数。 调用宏时,在最后一个命名参数(此宏没有)之后的参数列表中的所有标记(包括任何逗号)都将成为变量参数。 这个令牌序列替换宏体中出现的标识符VA_ARGS 。 因此,我们有这个扩展:

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

对于该特定forms,请在页面中进一步引用:

如果您的宏很复杂,您可能需要一个比__VA_ARGS__更具描述性的变量参数__VA_ARGS__CPP允许这作为扩展。 您可以在“……”之前写一个参数名称; 该名称用于变量参数。 可以编写上面的eprintf宏

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

可变数量的参数。 请参见可变参数宏

它是一个可变宏。

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

表格

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

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

标准C99表格将是

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