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

我在 C 编程的不同标头中看到过这种表示法,我基本上理解它是传递参数,但我不明白这种“三点表示法”叫什么?

有人可以用例子解释它或提供关于 VA Args 的链接吗?

4

2 回答 2

37

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

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

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

或使用任意数量的参数。

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

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

所以 DEBUG("foo", "bar", "baz");将被替换为printString ("foo", "bar", "baz")

于 2014-09-26T08:56:53.857 回答
10

__VA_ARGS__这些点与, 可变参数宏一起被称为

调用宏时,其参数列表 [...] 中的所有标记 ,包括任何逗号, 都将成为变量参数。此标记序列替换宏主体中出现的标识符VA_ARGS

来源,我的大胆强调。

使用示例:

#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.
于 2014-09-26T07:20:30.863 回答