は、固定パラメータを必要とし、指定されたパラメータ次次パラメータにva_list
を初期化します。あなたの関数には固定パラメータが1つしかないので、va_start()
を使用してva_list
に含めるオプションはありません。その前に固定パラメータがないからです。 32ビットのみで
(64ビットは、はるかに複雑である)、あなたがあなた自身のソースファイルにコンパイラのソースvarargs.h
からva_start()
またはstdargs.h
ためのコード(または同等のコード)をコピーしてva_arg
を初期化するために、それを微調整することができますそれに続くアドレスではなく、指定されたパラメータ自体のアドレスを使用します。だから、あなただけの+__size(parmN)
部分削除します
#ifdef __cplusplus
#define va_start(ap, parmN) ((void)((ap) = (std::va_list)((char _FAR *)(&parmN)+__size(parmN))))
#else
#define va_start(ap, parmN) ((void)((ap) = (va_list)((char _FAR *)(&parmN)+__size(parmN))))
#endif
:C++ Builderで、va_start()
は次のように定義されて
は、例えば、Visual Studioで
#ifdef __cplusplus
#define my_va_start(ap, parmN) ((void)((ap) = (std::va_list)((char _FAR *)(&parmN))))
#else
#define my_va_start(ap, parmN) ((void)((ap) = (va_list)((char _FAR *)(&parmN))))
#endif
を、va_start()
は次のように定義されています。
#define _crt_va_start(ap,v) (ap = (va_list)_ADDRESSOF(v) + _INSIZEOF(v))
#define va_start _crt_va_start
だから、電子+ _INSIZEOF(v)
部分:
#define my_va_start(ap,v) (ap = (va_list)_ADDRESSOF(v))
あなたはおそらくそのva_start()
源を得ることができないので、GCCは実際に、コンパイラ組み込み関数の代わりにマクロを使用しますが、生成されたコードはcdecl
呼び出し規約(のみ呼び出し規約そのため、類似していなければなりません32ビットで可変パラメータをサポート)は、コンパイラ間でかなり標準化されています。
void test(int firstArg, ...){
va_list va = (va_list) &firstArg;
passFunction(va);
}
を使用可能な可変引数テンプレートを持っている場合は、私は、:それはあなたのコンパイラとの互換性がある場合は、ちょうど、それを直接コーディングすることができるように
いずれかの方法で、プリプロセッサによって生成されたコードは、ほぼ同じになってしまいますそれらを代わりに使用することを推奨します。 – chris
私はそれらを使用することはできません、私はそれらを呼び出すC関数を持っているので、テスト関数の引数はCと互換性がなければなりません。 –
タグC++と 'cout << x << endl;で投稿を複雑にするのはなぜですか? 'printf("%d \ n "、x);' – chux