宏中的__VA_ARGS__是什么意思?

时间:2014-09-26 07:10:37

标签: c gcc variadic-macros variadic-functions

/* Debugging */
#ifdef DEBUG_THRU_UART0
#   define DEBUG(...)  printString (__VA_ARGS__)
#else
void dummyFunc(void);
#   define DEBUG(...)  dummyFunc()   
#endif

我在C编程的不同标题中看到了这种符号,我基本上理解它是通过参数,但我不明白这个“三点符号”是什么叫?

有人可以通过示例解释它或提供有关VA Args的链接吗?

2 个答案:

答案 0 :(得分:4)

这些点与__VA_ARGS__可变参数宏一起被调用

  

调用宏时,其参数列表中的所有标记 [...],包括逗号,   成为变量参数。这个令牌序列取代了   宏体中的标识符 VA_ARGS ,无论它出现在哪里。

source,大胆强调我的。

使用样本:

#ifdef DEBUG_THRU_UART0
#   define DEBUG(...)  printString (__VA_ARGS__)
#else
void dummyFunc(void);
#   define DEBUG(...)  dummyFunc()   
#endif
DEBUG(1,2,3); //calls printString(1,2,3) or dummyFunc() depending on
              //-DDEBUG_THRU_UART0 compiler define was given or not, when compiling.

答案 1 :(得分:4)

这是一个varadic宏。这意味着您可以使用任意数量的参数调用它。他们三个 ... 类似于C中varadic function中使用的相同构造

这意味着您可以像这样使用宏

DEBUG("foo", "bar", "baz");

或者有任意数量的论点。

__VA_ARGS__再次引用宏本身的变量参数。

#define DEBUG(...)  printString (__VA_ARGS__)
               ^                     ^
               +-----<-refers to ----+

因此DEBUG("foo", "bar", "baz");将替换为printString ("foo", "bar", "baz")