varargs(va_list va_start) 不适用于传递引用参数 [英] varargs(va_list va_start) doesn't work with pass-by-reference parameter

查看:33
本文介绍了varargs(va_list va_start) 不适用于传递引用参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能的重复:
是否有使用带参考参数的可变参数的问题

我对可变参数有疑问.查看我的代码(Microsoft Visual Studio 2005 或 2008).

Hi, I have a problem with varargs. Look at my code(Microsoft Visual Studio 2005 or 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;
}

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

function T1, T2 work well. But T3 function have a problem. The pointer p doesn't point "Test3". Can't I use va_start with pass-by-reference? Thanks in advance.

推荐答案

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

You cannot use references with va_start according to C++ Standard 18.7/3:

ISO C 对头文件中 va_start() 宏的第二个参数的限制在本国际标准中有所不同.参数 parmN 是函数定义的可变参数列表中最右边的参数(就在 ... 之前的那个).如果参数 parmN 是用函数、数组或引用类型声明的,或者用不兼容的类型声明的对于传递没有参数的参数时产生的类型,行为是未定义.

The restrictions that ISO C places on the second parameter to the va_start() macro in header are different in this International Standard. The parameter parmN is the identifier of the rightmost parameter in the variable parameter list of the function definition (the one just before the ...). If the parameter parmN is declared with a function, array, or reference type, or with a type that is not compatible with the type that results when passing an argument for which there is no parameter, the behavior is undefined.

这篇关于varargs(va_list va_start) 不适用于传递引用参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆