5

マクロに関するコードを探していましたが、マクロ«va_start»の次のようなコードを見つけました。

#define __va_argsiz(t)  \
    (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
#define va_start(ap, pN)    \
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN)))

«__va_argsiz»関数の目的を正確に知りたいのですが。アライメントの制限ですか?

ありがとう !

4

4 に答える 4

4

アライメントと、Cのデフォルトのタイププロモーションルールの両方。

于 2012-04-27T08:01:03.193 に答える
3

最初の引数のサイズに基づいて、可変引数リストの開始を計算するために使用されているようです。最初の引数は必須の通常の引数です。つまりprintf()、フォーマット文字列へのポインタになります。

于 2012-04-27T08:02:02.833 に答える
1

これは、可変長引数に使用されます。たとえば、printfこのような可変長の引数リストを使用します。__va_argsizリストのサイズを計算しva_start、開始を決定します。

于 2012-04-27T08:03:36.923 に答える
1

「制限」なし、実装。タイプの場合は、の倍数に__va_argsiz 切り上げます。これが必要なのは、varargs関数呼び出しプロトコルの一部として呼び出しスタックに渡される不明な引数が自動的に整列されて(明らかにプラットフォーム上で)の倍数でスペースが割り当てられ、そこから適切に取得する必要があるためです。sizeof(t)tsizeof(int)sizeof(int)

http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/も参照してください。

于 2012-04-27T09:23:42.237 に答える