http://www.cplusplus.com/reference/cstdarg/va_list/ 上記のリンクによれば、va_list
は一部のマクロで使用される引数またはパラメータです-va_start
、 va_arg
、va_end
。これらのマクロはstdarg.h
ファイルにあります。
va_list
は複数の値を保持できることを知っていますが、va_list
はどのような種類のエンティティですか?私の質問は、va_list
の背後にある基本的なメカニズムは何ですか?複数の値を保持するにはどうすればよいですか? (たとえば、配列は複数の値を保持でき、その背後にあるメカニズムは添え字値によって参照される複数のメモリ位置です。配列はCに存在する定義済みのデータ構造です。)
2つ目の質問は、va_list
はどこに定義されているのですか?
あなたの質問への答えはここにあります: https://stackoverflow.com/questions/4958384/what-is-the-format-of-the-x86-64-va-list-structure
Va_list型は、va_argマクロを実装するために必要な情報を含む1つの構造体の1つの要素を含む配列です。 va_listタイプのC定義は、以下の図に示されています
typedef struct {
unsigned int gp_offset;
unsigned int fp_offset;
void *overflow_arg_area;
void *reg_save_area;
} va_list[1];
va_list
はstdarg.h
で http://www.cplusplus.com/reference/cstdarg/va_list/ 状態として定義されています。
Std libcの入出力を知る必要がある場合は、本 "The Standard C Library" by Plauger を参照してください。
ターゲットプラットフォームの [〜#〜] abi [〜#〜] の仕様と 呼び出し規約 もご覧ください。 x86-64/Linuxの場合は、 x86-64 ABI の補足を読んでください( x86呼び出し規約 ウィキページも参照してください)。
[〜#〜] gcc [〜#〜] コンパイラには、<stdarg.h>
のいくつかの側面が組み込まれています(例:__builtin_va_start
、__builtin_va_arg
など...) )および<stdarg.h>
はコンパイラーによって提供されます。 __ builtin_va_arg_pack なども参照してください。
libffi にも興味があるかもしれません(たとえば、可変個の関数への呼び出しを動的に構築したい場合)。