gpt4 book ai didi

c++ - 如何正确的va_end?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:03 25 4
gpt4 key购买 nike

#include <cstdarg>
using namespace std;

void do_something( va_list numbers, int count ) {
// ^
// Should I call this by reference here? I mean, va_list & numbers?
//... stuff
va_end( numbers );
}

void setList( int count, ... ) {
va_list numbers;
va_start( numbers, count );
do_something( numbers, count );
}

int main() {
setList( 2, 0, 1 );
return 0;
}

当将 va_list 传给另一个函数时,我应该如何将它传递给那个函数?我知道当使用 va_list 完成操作时必须调用 va_end 我很困惑是否应该通过引用调用它。 va_list 是否会正确结束,即使它不是通过引用调用?

最佳答案

可变参数列表:

你不应该在以 va_list 作为参数的函数中使用 va_end!

来自 va_arg 的 (Linux) 手册页:

Each invocation of va_start() must be matched by a corresponding invocation of va_end() in the same function.

(强调我的)

在具有 va_list 参数的函数中,按值获取 va_list(作为 C 库函数,如 vprintf,... , 也)。

示例:

#include <cstdarg>
#include <iostream>

void v_display_integers(int count, va_list ap) {
while(0 < count--) {
int i = va_arg(ap, int);
std::cout << i << '\n';
}
}

void display_integers(int count, ...) {
va_list ap;
va_start(ap, count);
v_display_integers(count, ap);
va_end(ap);

// You might use 'va_start' and 'va_end' a second time, here.
// See also 'va_copy'.
}

int main() {
display_integers(3, 0, 1, 2);
}

注意:

在 C++ 中,您应该避免使用可变参数列表。备选方案是 std::arraystd::vectorstd::initializer_list 和可变参数模板。

关于c++ - 如何正确的va_end?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37454179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com