va_arg(a,type)
マクロは__builtin_va_arg(a,type)
、コンパイラの組み込み部分に展開されます。
タイプベースの機能を実装することは可能ですか?
va_arg(a,type)
マクロは__builtin_va_arg(a,type)
、コンパイラの組み込み部分に展開されます。
タイプベースの機能を実装することは可能ですか?
va_argは、関数に渡される引数の実際の型を判別できませんが、型マクロ引数として渡される型をその型として使用することに注意してください。
ここva_arg
からの1つの可能性は、どのように機能するかを見てみましょう。
#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
まず第一に、それは関数ではなくマクロです。
と同じタイプベースのマクロを記述したい場合はvar_arg
、2つの主要なツールとがpointers
ありsizeof
ます。
ステップを使用して、ポインタを増減/ルックアップできsizeof
ます。
プリプロセッサを使用すると、制限はありますが、実際に型ベースの機能を実装できます。ディレクティブはコピー/貼り付けで機能することを忘れないでください#define
。たとえば、C標準のタイプを比較することはできません(*)。
ただし、type
引数を再利用して、型ジェネリック関数を作成できます。min
総称関数の例を次に示します。
#define DEFINE_MIN(type) \
int min_##type(type a, type b) \
{ return a < b ? a : b; }
ちなみに、gcc
拡張機能typeof
は、式のタイプを示します(プログラマーの引数に依存しなくなりました)。さらに、最近では、C11_Generic
キーワードを使用すると、さまざまなタイプの式に対してさまざまな処理を記述できます。
(*)の場合va_arg
、type
引数は多くの場合、とのサイズを取得するために使用されtype
ますtype*
。