我有一個類非靜態成員函數,它具有可變參數,我正在使用64位運行時在64位Windows上編譯Visual Studio 2005。x64在Visual Studio 2005中的va_list
void Class::Foo(void* ptr,...)
{
va_list args;
va_start(args,ptr);
float f=va_arg(args,float);
va_end(args)
}
我期待一個浮點數,我將一個浮點數傳遞給函數。但是,當我調試 - 我沒有得到我通過的浮動。事實上 - 它被64位雙精度函數所接收!我必須這樣做:
double d=va_arg(args,double);
float f=(float)d;
現在我知道Win64的喜歡在寄存器中傳遞參數,並蒙上彩車它這樣做的時候,不應該的va_list總是在堆棧上?
根據most references,我應該只是一個完整的傳遞參數的乾淨堆棧。
我的問題是:這是正確的行爲,還是一個錯誤?如果這是一個錯誤,是我的錯誤還是微軟?
我定義了WIN64和_M_AMD64,而WIN32是未定義的。
我認爲這是正確的。雖然C++標準中沒有關於「默認參數促銷」的內容,但是我認爲C標準不適用。據我所知,你引用的文字說,因爲傳遞給變量參數函數的參數不是原型的(因爲你不能在變量類型時對它們進行原型設計),它們總是被提升爲最大的相關類型 - int或double。奇怪的行爲我認爲 - 但顯然這些是規則。 – Roderick 2009-08-19 19:58:46