gpt4 book ai didi

linux - 如何以嵌套方式使用 va_list 对象,尤其是在 gcc x64 编译器上

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:25 27 4
gpt4 key购买 nike

请看我的小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 编译器上相同的结果。

最佳答案

不要对 va_list 耍小聪明。相反,使用这样的代码:

nest2(fmt, args1);

(即确保所有函数都使用隐藏在 va_list 后面的相同结构)。然后你可以像这样定义第二个函数:

void nest2(const char *fmt, va_list args1)

还要确保您调用 va_end() 恰好一次。嵌套不会可靠地工作(即,如果它能工作,那比其他任何事情都更幸运)。

如有疑问,请查看 GLIBC 的源代码,尤其是 fprintf.cvfprintf.c .

int
__fprintf (FILE *stream, const char *format, ...)
{
va_list arg;
int done;

va_start (arg, format);
done = vfprintf (stream, format, arg);
va_end (arg);

return done;
}

及以后:

int
vfprintf (FILE *s, const CHAR_T *format, va_list ap)
{

关于linux - 如何以嵌套方式使用 va_list 对象,尤其是在 gcc x64 编译器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com