4

我在使用 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)。我对正在发生的事情感到非常困惑。

4

2 回答 2

8

在可变参数调用的上下文中,float实际上提升为double. 因此,您实际上需要拉出doubles,而不是floats。这与%fforprintf()同时使用float和的原因相同double

于 2012-06-03T14:44:41.677 回答
2

由于我们在这里讨论的是 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 变量。它们是类型不安全的并且充满了陷阱。

于 2012-06-03T15:10:42.343 回答