2012-01-27 13 views

答えて

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) 
+0

偉大な答え、+1とダニ:D – perfwill

3

可変数のパラメータ。 variadic macros

+0

だろう。しかし、なぜ "..." の前に、 "" があるのでしょうか? – perfwill

+1

@perfwill、そのような構文は、便宜上 - 名前を付けることです。 –

3

を書くことができます。

可変長マクロは、可変数の引数を受け入れるマクロです。この機能はC99で導入されました。パラメータa...

形態

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

a__VA_ARGS__識別子に名前を与え、GNU拡張です。

標準C99フォームが

#define IDEDBUG(...) printf(__VA_ARGS__) 
関連する問題