クラスの非静的メンバー関数があり、可変引数があります。64 ビット Windows で、64 ビット ランタイムを使用して Visual Studio 2005 でコンパイルしています。
void Class::Foo(void* ptr,...)
{
va_list args;
va_start(args,ptr);
float f=va_arg(args,float);
va_end(args)
}
float を期待しています。float を関数に渡します。しかし、デバッグすると、渡したフロートが得られません。実際、これは関数によって 64 ビット double として受信されています! 私はこれをしなければなりません:
double d=va_arg(args,double);
float f=(float)d;
これで、Win64 はレジスタでパラメータを渡すのが好きで、これを行うときにフロートをキャストすることがわかっています。
ほとんどの参照によると、渡されたパラメーターでいっぱいのクリーンなスタックが必要です。
私の質問は次のとおりです。これは正しい動作ですか、それともバグですか? また、それがバグである場合、それは私のバグですか、それとも Microsoft のバグですか?
WIN64 と _M_AMD64 を定義していますが、WIN32 は未定義です。