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

C プログラミングのさまざまなヘッダーでこの表記を見たことがあります。基本的には引数を渡すことを理解していましたが、この「3 つのドット表記」が何と呼ばれているのかわかりませんでした。

誰かが例を挙げて説明したり、VA Args についてのリンクを提供したりできますか?

4

2 に答える 2

37

可変長マクロです。これは、任意の数の引数で呼び出すことができることを意味します。この 3 つは、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 に答える