[英]C/C++ va_list not returning arguments properly
我使用va_list時遇到問題。 以下代碼適用於int:
main() {
int f1=1;
float** m = function(n,f1);
}
float** function(int n,...) {
va_list mem_list;
va_start(mem_list, n);
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
//m[i][j]=va_arg(mem_list,float);
int f = va_arg(mem_list,int);
printf("%i \n",f);
}
}
va_end(mem_list);
return NULL;
}
但是,當我改為浮動即
float f1=1.0;
float f = va_arg(mem_list,float);
printf("%f \n",f);
它不返回正確的值(值為0.00000)。 我對發生的事情感到非常困惑。
在varargs調用的上下文中, float
實際上被提升為double
。 因此,你需要實際上拉出double
出,而不是float
。 這與printf()
%f
同時適用於float
和double
原因相同。
由於我們在這里討論C ++,您可能想要使用更新的C ++ 11工具。
我可以建議可變參數模板,但它可能有點過於先進,另一方面傳遞任意長列表現在是std::initializer_list<T>
其中T
是一個簡單類型。
void function(std::initializer_list<int> list);
它沒有很多功能,只是:
size()
返回列表中的元素數量 begin()
和end()
,像往常一樣返回迭代器 所以你可以這樣做:
void function(std::initializer_list<int> list) {
std::cout << "Gonna print " << list.size() << " integers:\n";
bool first = true;
for (int i: list) {
if (first) { first = false; } else { std::cout << ", "; }
std::cout << i;
}
std::cout << "\n";
}
然后將其調用為:
int main() {
function({1, 2, 3, 4, 5});
}
將打印:
Gonna print 5 integers:
1, 2, 3, 4, 5
通常在C ++中,遠離C-variadic。 它們類型不安全且充滿了陷阱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.