免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5396 | 回复: 2
打印 上一主题 下一主题

[C++] va_list类型的变量可以直接赋初值吗? [复制链接]

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-27 14:57 |只看该作者 |倒序浏览
做代码移植的时候,在一个函数中有一处代码, va_list ListA = ListB;
其中ListB是该函数的入参,也是va_list类型的。
在linux下编译的时候该处代码报错如下:
   error: array must be initialized with a brace-enclosed initializer

然后我在网上看了下,有人说va_list类型的变量不能直接赋初值。
百科里面有这么一段:
   VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):
      #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
    VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
      #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
    VA_END宏,清空va_list可变参数列表:
      #define va_end(ap) ( ap = (va_list)0 )
难道得把代码改成下面这样?
   va_list ListA;
   va_start(ListA, ListB);

希望了解的大大们给我讲解下,谢谢了。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-09-27 15:32 |只看该作者
NAME
       stdarg.h - handle variable argument list

SYNOPSIS
       #include <stdarg.h>

       void va_start(va_list ap, argN);
       void va_copy(va_list dest, va_list src);
       type va_arg(va_list ap, type);
       void va_end(va_list ap);

论坛徽章:
0
3 [报告]
发表于 2013-09-27 16:50 |只看该作者
VS下直接等于赋值,linux下要va_copy。
写个宏包裹一下:
  1. #if defined(_WIN32)
  2. #  define VA_COPY(dst, src)     dst = src
  3. #else
  4. #  define VA_COPY(dst, src)     va_copy(dst, src)
  5. #endif
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP