C プリプロセッサの VA_ARGS
を使用した可変個引数マクロの引数の数の決定 C の可変個引数マクロでは、任意の数の引数。ただし、可変個引数マクロに渡される引数の数を決定するのは困難な場合があります。この記事では、VA_ARGS プリプロセッサ マクロを使用したシンプルで効率的なソリューションについて説明します。
VA_ARGS について
VA_ARGS は、実際のマクロに展開される組み込みプリプロセッサ マクロです。可変個引数マクロに渡される引数。ただし、引数の数に関する情報は提供されません。
整数配列サイズを使用した引数の数
可変個引数マクロの引数の数を決定するには、次のようにします。 C プリプロセッサの配列サイズの動作を利用できます。次のマクロ NUMARGS() は、この手法を使用します。
#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
このマクロは、渡されたすべての引数を含む配列のサイズを整数のサイズで割ったサイズに拡張されます。結果の値は引数の数です。
使用例
引数の合計を計算する次のマクロ SUM() について考えてみましょう。
#define SUM(...) (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))
SUM() を使用するには、次のように可変数の引数を指定して呼び出します。 so:
SUM(1); SUM(1, 2); SUM(1, 2, 3);
NUMARGS() マクロは引数の数をカウントし、それを引数とともに sum() 関数に渡します。
空の引数リストの処理
デフォルトでは、空の引数リストを指定して呼び出された場合、NUMARGS() マクロは失敗します。これに対処するために、GNU C 拡張機能を使用してマクロのバリアントを定義できます。
#define NUMARGS(...) (sizeof((int[]){0, ##__VA_ARGS__})/sizeof(int)-1)
このバリアントでは、空の引数リストが許可され、すべてのケースで引数の数が正しくカウントされます。
結論
VA_ARGS プリプロセッサ マクロは次のようにすることができます。可変個引数マクロの引数の数を効率的にカウントするために利用されます。この手法を整数配列のサイズ操作と組み合わせることで、C で可変数の引数を処理するための便利なマクロを開発できます。
以上がC 可変個引数マクロの引数の数を確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。