当前位置:  技术问答>linux和unix

【散分】va_arg问题,令人郁闷的Gcc&CC&hcc&yacc

    来源: 互联网  发布时间:2015-08-21

    本文导语:  va_arg如果取值到了最后,没有值可取的时候会怎么样? C99上没有规定 VC等编译器会返回一个指向0的指针 linux 的info libc也是这么说的 可是TMD实际上返回的是一个不知所云的东西,还得我1000多行代码要动大手术了 郁...

va_arg如果取值到了最后,没有值可取的时候会怎么样?
C99上没有规定
VC等编译器会返回一个指向0的指针
linux 的info libc也是这么说的

可是TMD实际上返回的是一个不知所云的东西,还得我1000多行代码要动大手术了


郁闷,散闷鄙视这些鸟人


|
哦?仔细说说?

|
同情你楼主!!

|

第一次怎么没发出去

|
同情, 不过,你能不能把你的写法,让大家来瞅瞅.:)

|
能事先确定传进去的参数个数不?

|
我 man 了一下 va_arg 的定义, 它说 va_arg 是一个宏定义,
如果到了最后一个,或者是指定的类型错误,将会产生随机错误。:-)
这也许就是你所出现的问题。
我想,这个可以这么解决,concat 函数这么定义:
  char * concat (int count, const char *str, ...);
其中count的意思就是,后面字符串的个数。

因为,你每次调用该函数的时候,应该是知道里面字符串的个数的。

|
这是man va_arg里面的原话:
      If there is no next argument, or if type is not compatible
      with  the  type  of  the actual next argument (as promoted
      according to  the  default  argument  promotions),  random
      errors will occur.

可能标准里没有规定,但是根据最后是NULL来判断是不好的方法。

|
!!!!!!
你没有理解
   typedef char *va_list;       
#  define va_start(ap, p)       (ap = (char *) (&(p)+1))
#  define va_arg(ap, type)      ((type *) (ap += sizeof(type)))[-1]
#  define va_end(ap)

或者
typedef char *  va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)      ( ap = (va_list)0 ) 

va_arg 返回 因你的库定义而有些不同
但返回值是不可能 如你所预料的
所以一般可变参数函数定义char * concat (const char *fmt, ...)

。。。。
    va_start(ap, fmt);//fmt限定参数个数
  //此时&ap + sizeof(char*) 就是 &ap + 4 (一般系统下)
while(*fmt){//判定参数是否结束
。。
     switch(*fmt++)
{。。
    va_arg(ap,type) 根据 type不同从&ap + 4开始取不同的长度数据出来,并把ap+=sizeof(type)

   有的系统va_arg返回type类型地址指针,有的返回type类型数据值,不尽相同。但不会用他来做是否还有参数标志


   va_end 就清空ap 一般 指向NULL
。。。

|
//此时&ap + sizeof(char*) 就是 &ap + 4 (一般系统下)
应该为 ap 的值 为 &fmt + sizeof(char*) 就是 &fmt + 4 (一般系统下)

|
根据 type不同从&ap + 4开始取不同的长度数据出来

这句中 &ap + 4 应该为 ap 地址 即 &fmt +sizeof(char*)

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
  • va_list(),va_start(),va_arg(),va_end() 详细解析


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3