web-dev-qa-db-ja.com

va_listの背後にある基本的なメカニズムは何ですか?それはどこに定義されていますか?

http://www.cplusplus.com/reference/cstdarg/va_list/ 上記のリンクによれば、va_listは一部のマクロで使用される引数またはパラメータです-va_startva_argva_end。これらのマクロはstdarg.hファイルにあります。

va_listは複数の値を保持できることを知っていますが、va_listはどのような種類のエンティティですか?私の質問は、va_listの背後にある基本的なメカニズムは何ですか?複数の値を保持するにはどうすればよいですか? (たとえば、配列は複数の値を保持でき、その背後にあるメカニズムは添え字値によって参照される複数のメモリ位置です。配列はCに存在する定義済みのデータ構造です。)

2つ目の質問は、va_listはどこに定義されているのですか?

8
aste123

あなたの質問への答えはここにあります: 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_liststdarg.hhttp://www.cplusplus.com/reference/cstdarg/va_list/ 状態として定義されています。

Std libcの入出力を知る必要がある場合は、本 "The Standard C Library" by Plauger を参照してください。

6
gon1332

ターゲットプラットフォームの [〜#〜] abi [〜#〜] の仕様と 呼び出し規約 もご覧ください。 x86-64/Linuxの場合は、 x86-64 ABI の補足を読んでください( x86呼び出し規約 ウィキページも参照してください)。

[〜#〜] gcc [〜#〜] コンパイラには、<stdarg.h>のいくつかの側面が組み込まれています(例:__builtin_va_start__builtin_va_argなど...) )および<stdarg.h>はコンパイラーによって提供されます。 __ builtin_va_arg_pack なども参照してください。

libffi にも興味があるかもしれません(たとえば、可変個の関数への呼び出しを動的に構築したい場合)。