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

吉姆·陈(Jimm Chen)

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

吉姆·陈(Jimm Chen)

我意识到传递va_list对象的地址(而不是对象本身)是可行的,并在linux gcc和MSVC 2008(32位和64位编译器)上进行了验证。

// va_nesta.c
#include <stdarg.h>
#include <stdio.h>
#include <assert.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's address.
    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); // ★use va_list object's address!

    va_end(args1);
}

int main()
{
    int var = 11;
    printf("Outer: @%p , %d\n", &var, var);
    nest1("abc", &var, var);


    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

配置Visual Studio 2013以允许ASPNETCOMPILER使用x64编译器进行预编译

来自分类Dev

如何使用带有 x64 编译器的 MsBuild.exe 编译大型 c++ 项目

来自分类Dev

在OS X Yosemite上使用gcc编译器编译OpenMP程序

来自分类Dev

使用32或64编译器的CMake

来自分类Dev

如何修复Python 3.5的pip无法在Windows x64上编译扩展

来自分类Dev

强制SCons在64位Windows上使用32位MSVC编译器

来自分类Dev

如何使编译器生成“ elf32-x86-64”格式的目标文件?

来自分类Dev

在流星上使用Traceur编译器

来自分类Dev

如何加快Delphi x64的编译时间?

来自分类Dev

如何加快Delphi x64的编译时间?

来自分类Dev

我如何获得此为x64编译

来自分类Dev

g ++编译器是否与C ++的gcc编译器相同?(Mac OS X)

来自分类Dev

在GCC编译器上使用C查找因素

来自分类Dev

在某些C ++编译器上使用限制限定符的编译器错误

来自分类Dev

如何安装 Open64 编译器?

来自分类Dev

如何告诉编译器在/ usr / lib / x86_64-linux-gnu中搜索一些库

来自分类Dev

如何使CMake在系统PATH上使用默认编译器?

来自分类Dev

将GCC编译器安装到Docker容器上

来自分类Dev

在Mac OS X上执行brew install gcc之后,由于缺少fortran编译器,仍然无法安装scipy

来自分类Dev

Linux上的Swift:如何指定编译器优化

来自分类Dev

如何在Ubuntu 18.04上安装交叉编译器?

来自分类Dev

Gtest无法在Mac上使用默认编译器链接

来自分类Dev

使用更新的编译器在启动板上构建

来自分类Dev

如何安装 Fortran 9x 编译器?

来自分类Dev

va_list在64位模拟器上崩溃

来自分类Dev

如何使Cisco VPN在Windows 8 x64上运行?

来自分类Dev

如何测试x64 CPU模拟器

来自分类Dev

在Mac上编译x264:“找不到可用的C编译器”和“ arm-linux-androideabi-gcc:找不到命令”

来自分类Dev

是否可以使用ocamlopt ghc和gcc编译器创建可移植的x86-64 Linux可执行文件?

Related 相关文章

  1. 1

    配置Visual Studio 2013以允许ASPNETCOMPILER使用x64编译器进行预编译

  2. 2

    如何使用带有 x64 编译器的 MsBuild.exe 编译大型 c++ 项目

  3. 3

    在OS X Yosemite上使用gcc编译器编译OpenMP程序

  4. 4

    使用32或64编译器的CMake

  5. 5

    如何修复Python 3.5的pip无法在Windows x64上编译扩展

  6. 6

    强制SCons在64位Windows上使用32位MSVC编译器

  7. 7

    如何使编译器生成“ elf32-x86-64”格式的目标文件?

  8. 8

    在流星上使用Traceur编译器

  9. 9

    如何加快Delphi x64的编译时间?

  10. 10

    如何加快Delphi x64的编译时间?

  11. 11

    我如何获得此为x64编译

  12. 12

    g ++编译器是否与C ++的gcc编译器相同?(Mac OS X)

  13. 13

    在GCC编译器上使用C查找因素

  14. 14

    在某些C ++编译器上使用限制限定符的编译器错误

  15. 15

    如何安装 Open64 编译器?

  16. 16

    如何告诉编译器在/ usr / lib / x86_64-linux-gnu中搜索一些库

  17. 17

    如何使CMake在系统PATH上使用默认编译器?

  18. 18

    将GCC编译器安装到Docker容器上

  19. 19

    在Mac OS X上执行brew install gcc之后,由于缺少fortran编译器,仍然无法安装scipy

  20. 20

    Linux上的Swift:如何指定编译器优化

  21. 21

    如何在Ubuntu 18.04上安装交叉编译器?

  22. 22

    Gtest无法在Mac上使用默认编译器链接

  23. 23

    使用更新的编译器在启动板上构建

  24. 24

    如何安装 Fortran 9x 编译器?

  25. 25

    va_list在64位模拟器上崩溃

  26. 26

    如何使Cisco VPN在Windows 8 x64上运行?

  27. 27

    如何测试x64 CPU模拟器

  28. 28

    在Mac上编译x264:“找不到可用的C编译器”和“ arm-linux-androideabi-gcc:找不到命令”

  29. 29

    是否可以使用ocamlopt ghc和gcc编译器创建可移植的x86-64 Linux可执行文件?

热门标签

归档