簡體   English   中英

C / C ++ va_list沒有正確返回參數

[英]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同時適用於floatdouble原因相同。

由於我們在這里討論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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM