4

va_arg(a,type)マクロは__builtin_va_arg(a,type)、コンパイラの組み込み部分に展開されます。

タイプベースの機能を実装することは可能ですか?

4

2 に答える 2

3

va_argは、関数に渡される引数の実際の型を判別できませんが、型マクロ引数として渡される型をその型として使用することに注意してください。

ここva_argからの1つの可能性は、どのように機能するかを見てみましょう。

#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))

まず第一に、それは関数ではなくマクロです。

と同じタイプベースのマクロを記述したい場合はvar_arg、2つの主要なツールとがpointersありsizeofます。

ステップを使用して、ポインタを増減/ルックアップできsizeofます。

于 2013-03-23T08:52:05.500 に答える
3

プリプロセッサを使用すると、制限はありますが、実際に型ベースの機能を実装できます。ディレクティブはコピー/貼り付けで機能することを忘れないでください#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_argtype引数は多くの場合、とのサイズを取得するために使用されtypeますtype*

于 2013-03-23T08:52:13.623 に答える