如何正确va_end?

时间:2016-05-26 07:25:39

标签: c++ variadic-functions

#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也会正确结束吗?

3 个答案:

答案 0 :(得分:7)

可变参数列表:

你不应该在以char ** alloc_2d_arr(int cnum, int rnum) { /* ((bytes for row pointers + (bytes for data)) */ char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char)); /* Initialize each row pointer to the first cell of its row */ char *p = (char *) (mtx + rnum); for (int i = 0; i < rnum; i++) { mtx[i] = p + i * cnum; } return mtx; } 为参数的函数中使用file = kit.to_file('/path/to/save/pdf')

来自va_end的(Linux)手册页:

  

每次调用va_start()都必须与相应的匹配   在相同的函数中调用va_end()。

(强调我的)

在具有va_list参数的函数中,按va_arg取值(作为C库函数,如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); } std::array和可变参数模板。

答案 1 :(得分:1)

我喜欢在与我调用va_start或va_copy相同的函数中调用va_end,就像任何其他资源分配/释放对一样。标准需要这种风格,尽管有些实现更容忍。

通常,va_lists按值传递。它们是小物件。

答案 2 :(得分:1)

宏函数va_end实现为void语句或重置va_list变量。

  

http://research.microsoft.com/en-us/um/redmond/projects/invisible/include/stdarg.h.htm

理论上,你可以在任何地方调用它,甚至可以跳过它。但是,要成为一名优秀的程序员,我们需要将其放在va_函数

之后