Ich habe eine Klasse nicht-statische Elementfunktion, und es hat variable Argumente, Ich kompiliere auf Visual Studio 2005 mit der 64-Bit-Laufzeit auf 64-Bit-Windows.x64 va_list in Visual Studio 2005
void Class::Foo(void* ptr,...)
{
va_list args;
va_start(args,ptr);
float f=va_arg(args,float);
va_end(args)
}
Ich erwarte einen Float, ich übergebe einen Schwimmer an die Funktion. Aber wenn ich debugge - ich bekomme nicht den Float, den ich bestanden habe. Tatsächlich - es wird von der Funktion als 64-Bit-Double empfangen! Ich muss dies tun:
double d=va_arg(args,double);
float f=(float)d;
Jetzt weiß ich Win64 mag Parameter in Registern übergeben, und wirft schwimmt, wenn er dies tut, sollte kein va_list immer auf dem Stapel sein?
Nach most references sollte ich nur einen sauberen Stapel voller der übergebenen Parameter haben.
Meine Frage ist: ist das richtige Verhalten oder ein Fehler? Und wenn es ein Fehler ist, ist es mein Fehler oder Microsoft?
Ich habe die definiert WIN64 und _M_AMD64, und WIN32 ist nicht definiert.
Ich denke, das ist richtig. Obwohl es im C++ - Standard nichts über "Standard-Argument-Promotions" gibt, glaube ich, dass der C-Standard zutrifft.Wie ich es verstehe, besagt der von Ihnen zitierte Text, dass ein Argument, das an eine Variable-Argument-Funktion übergeben wird, nicht prototyped ist (da Sie die Typen nicht prototypieren können, wenn sie variabel sind), werden sie immer zum größten relevanten Typ hochgestuft. int oder doppelt. Odd Verhalten denke ich - aber anscheinend sind dies die Regeln. – Roderick