如何正确va_end
How to properly va_end?
#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_end
va_list
我很困惑我是否应该通过引用来调用它。即使没有通过引用调用va_list
,它也会正确结束吗?
变量参数列表:
您永远不应该在将va_list
作为参数的函数中使用va_end
!
从 (Linux) 手册页va_arg
:
每次调用 va_start() 必须匹配相应的 在同一函数中调用 va_end()。
(强调我的)
在具有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::array
、std::vector
、std::initializer_list
和可变参数模板。
我更喜欢在调用va_start或va_copy的同一函数中调用va_end,就像任何其他资源分配/释放对一样。该样式是标准所要求的,尽管某些实现更宽容。
通常,va_lists是按值传递的。它们是小物体。
宏
函数va_end
实现为 void 语句或重置 va_list
变量。
http://research.microsoft.com/en-us/um/redmond/projects/invisible/include/stdarg.h.htm
从理论上讲,您可以在任何地方调用它,甚至可以跳过它。但是,要成为一名优秀的程序员,我们需要将其放在va_
函数之后。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 了解向量中的 .begin 和 .end
- 如何实现链表的 end()?
- 使用 map.end() 访问 map 的最后一个元素
- C++ const char with .begin() and .end()
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- 为什么 std::find( s.begin(), s.end(), val ) 比集合 s 的 s.find(val) 慢 1000 倍<int>?
- 如何使用vector.begin()和vector.end()遍历矩阵?
- 我当前实现的双向链表类是否需要重构迭代器 end() 功能?
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 在不使用vector.end()的情况下迭代std::vector
- 编译代码时"[Warning] extra tokens at end of"