我有一個variadic函數,它接受一個float參數.為什麼不起作用?
va_arg(arg, float)
對應的函數的參數在傳遞給可變參數函數之前…被提升.char而short被晉升為int,float被晉升為double等
6.5.2.2.7函數原型聲明符中的省略号表示法導緻參數類型轉換在最後聲明的參數之後停止.預設參數提升是在尾随參數上執行的.
原因是C的早期版本沒有函數原型; 參數類型在功能站點聲明,但在呼叫站點未知.但是不同的類型以不同的方式表示,并且傳遞的參數的表示必須與被調用函數的期望相比對.是以可以使用int參數将char和short值傳遞給函數,或者可以将float值傳遞給具有double參數的函數,編譯器将"較小的類型"提升為較大的類型.當在調用站點不知道參數的類型時,仍然會看到這種行為 - 即,對于可變參數函數或沒有原型聲明的函數(例如int foo()😉.
#include <stdio.h>
#include <stdarg.h>
void foo(int n, ...)
{
va_list vl;
va_start(vl, n);
int c;
double val;
for(c = 0; c < n; c++) {
val = va_arg(vl, double);
printf("%f\n", val);
}
va_end(vl);
}
int main(void)
{
foo(2, 3.3f, 4.4f);//調用時需指定資料類型為double
return 0;
}
3.300000
4.400000