C++ の可変個引数マクロ

可変パラメーター マクロ (可変個の引数を持つマクロまたは可変個引数マクロ) とは、さまざまな数のパラメーターを受け入れることができる通常の C++ 関数を定義するのと同じように、さまざまな数のパラメーターを受け入れることができるマクロを定義できることを意味します。

基本的な文法

#define DEBUG(format, ...) fprintf (stderr, format, __VA_ARGS__)
#define DEBUG(format, args...) fprintf (stderr, format, args)
#define DEBUG(format, args...) fprintf (stderr, format, ##args)
#define DEBUG(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
  • __VA_ARGS__ は、マクロ関数内の最後の名前付き変数以降のすべてを置き換えます。これ自体はコンパイラによって事前定義されたマクロです。
  • args は、C++ でサポートされる変数パラメータのエイリアスです。
  • args または __VA_ARGS__ が空の場合、## はコンパイル エラーを防ぐために args または __VA_ARGS__ の前にある余分なコンマを削除します。

フォーマットされた印刷文字列を実装する

可変パラメーター マクロを使用して文字列をフォーマットして出力するには、多くの場合、vsnprint() の使用が必要になります。この関数は次のように定義されます。

int vsnprintf( char* buffer, size_t buf_size, const char* fmt, va_list vlist );

vsnprintf() 関数は、フォーマット文字列 fmt が指す文字列を文字列バッファ バッファに書き込みます。書き込むことができる最大文字数は buf_size です。文字を書き込んだ後、終端の null 文字を追加します。buf_size が 0 に等しい場合は、 、何も書き込まれず、バッファはヌルポインタである可能性があります。

特に、フォーマット文字列 fmt には、vlist 列として渡される変数の値に置き換えられる% で始まるプレースホルダーが含まれる場合があります。

va_list

va_list 型の変数には、変数パラメータのさまざまな情報が格納されます。使用方法は次のとおりです。

va_list   args;

va_list 型の変数 args を作成します。この時点では、args は初期化されていません。これは null ポインタに似ています。次に、この ''null ポインタ'' を、fmt の後など、必要な位置に割り当てる必要があります。

va_start(args, fmt);

va_start() を呼び出し、args が fmt の後のパラメータを指すようにすると、args を使用してこれらのパラメータにアクセスできます。

 //每次返回一个int ( 根据实际情况确定类型) 参数并把位置往前推1,一般从前往后循环调用。
var_arg(args,int);   

訪問後、args は空に設定されます。

 va_end(args);

おすすめ

転載: blog.csdn.net/TABE_/article/details/130413542