Cプリプロセッサ・マクロ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/23 20:49 UTC 版)
「可変長引数」の記事における「Cプリプロセッサ・マクロ」の解説
C言語のプリプロセッサのマクロ定義において、可変長引数マクロには、以前はトリック的な方法が使われていたが、C99で本物の可変長引数マクロが標準化された。__VA_ARGS__という識別子を使用する。 次のような関数の呼び出しに展開されるマクロを定義したいとする。関数が可変長引数をとるため、機能を制限したくなければ、マクロも可変長引数をとるようにしたい。 void realdbgprintf(const char *sourceFilename, int sourceLineNumber, const char *formatString, ...); C++での可変長引数マクロの設計に問題があるため[要説明]、以下に示すような定義は行えない。 #define dbgprintf(cformat, ...) realdbgprintf(__FILE__, __LINE__, cformat, __VA_ARGS__) この書き方だと、dbgprintf("Hello")と記述した際にrealdbgprintf(__FILE__, __LINE__, "Hello", )と展開される。関数の引数リストをコンマで終えると構文エラーを起こすため、printfのような使い勝手は得られない。 gccの独自構文では##__VA_ARGS__という識別子もサポートしている。これを利用することにより引数がゼロ個のものも定義できる。 #define dbgprintf(cformat, ...) realdbgprintf(__FILE__, __LINE__, cformat, ##__VA_ARGS__) gcc以外でも使用するためには__VA_ARGS__を使うほかないが、その場合は書式文字列も含めて可変長引数として渡す必要がある。 #define dbgprintf(...) realdbgprintf(__FILE__, __LINE__, __VA_ARGS__) Microsoft Visual C++の独自拡張モードでは、ゼロ個の引数を受け取る__VA_ARGS__は末尾コンマを抑制する動作をする。 C++20では、空の可変引数を処理するための__VA_OPT__マクロをサポートする。
※この「Cプリプロセッサ・マクロ」の解説は、「可変長引数」の解説の一部です。
「Cプリプロセッサ・マクロ」を含む「可変長引数」の記事については、「可変長引数」の概要を参照ください。
- Cプリプロセッサ・マクロのページへのリンク