【发布时间】:2014-10-27 15:03:55
【问题描述】:
请看一下我的小 C/C++ 程序。
// va_nest.c
#include <stdarg.h>
#include <stdio.h>
void nest2(const char *fmt, ...)
{
va_list args2, args_dig;
int *pi, i;
va_start(args2, fmt);
args_dig = va_arg(args2, va_list);
// !!! try to fetch the nested va_list object.
pi = va_arg(args_dig, int*);
i = va_arg(args_dig, int);
printf("Inner: @%p , %d\n", pi, i);
va_end(args2);
}
void nest1(const char *fmt, ...)
{
va_list args1;
va_start(args1, fmt);
nest2(fmt, args1);
va_end(args1);
}
int main()
{
int var = 11;
printf("Outer: @%p , %d\n", &var, var);
nest1("abc", &var, var);
return 0;
}
在 openSUSE 13.1 x86 上,它的输出只是我所期望的(无论使用 gcc 还是 g++),
Outer: @0xbfa18d8c , 11
Inner: @0xbfa18d8c , 11
但是,在 openSUSE 13.1 x64 机器上使用 x86_64 编译器会失败。
如果我用gcc 编译它,它可以编译,但输出是意外的。
$ gcc -o vac va_nest.c
$ ./vac
Outer: @0x7fffb20f766c , 11
Inner: @0x1b01000000636261 , 4209411
如果我用g++编译它,它甚至无法编译。
$ g++ -o vacpp va_nest.c
va_nest.c: In function ‘void nest2(const char*, ...)’:
va_nest.c:12:11: error: invalid array assignment
args_dig = va_arg(args2, va_list);
^
gcc 和 g++ 版本是 4.8.1
有人可以帮我吗?我希望在 x64 上实现与在 Linux x86 编译器中相同的结果。
【问题讨论】: