varargs(va_list va_start)不适用于pass-by-reference参数

P-P*_*P-P 13 c++ variadic-functions visual-c++

可能重复:
是否有使用带参考参数的varargs

嗨,我有一个varargs的问题.看看我的代码(Microsoft Visual Studio 2005或2008).

#include <stdarg.h>

struct Test { int a; };

void T1(int n, ...) {
 va_list args;
 va_start(args, n);
 char* p = va_arg(args, char*);
 va_end(args);
}

void T2(Test n, ...) {
 va_list args;
 va_start(args, n);
 char* p = va_arg(args, char*);
 va_end(args);
}

void T3(const Test& n, ...) {
 va_list args;
 va_start(args, n);
 char* p = va_arg(args, char*);  // p corrupt!!
 va_end(args);
}

int _tmain(int argc, _TCHAR* argv[]) {
 const Test t;
 T1(1, "Test1");
 T2(t, "Test2");
 T3(t, "Test3");
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

功能T1,T2运行良好.但T3功能有问题.指针p不指向"Test3".我不能将va_start与pass-by-reference一起使用吗?提前致谢.

Kir*_*sky 13

va_start根据C++标准18.7/3,您不能使用引用:

ISO C对标头中va_start()宏的第二个参数的限制在本国际标准中是不同的.参数parmN是函数定义的变量参数列表中最右边的参数的标识符(恰好在......之前).如果使用函数,数组或引用类型声明参数parmN,或者使用与传递没有参数的参数时生成的类型不兼容的类型,则行为未定义.