首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教! #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )解决方案

2012-02-19 
求教! #define va_arg(ap,t) ( *(t *)((ap + _INTSIZEOF(t)) - _INTSIZEOF(t)) )#defineva_arg(ap,t)(*(t

求教! #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define   va_arg(ap,t)   (   *(t   *)((ap   +=   _INTSIZEOF(t))   -   _INTSIZEOF(t))   )

按C标准的意思,是说将将指针调到本参数的结尾,也就是下一个参数的首地址。
我实在不明白,_INTSIZEOF(t)将对应类型t对齐后先加到va_list里,又减了出去,到底进行了怎样的操作????

钱不多但是全部了!!!谢谢了!!!

[解决办法]
举个例子说明吧
int y=va_arg(x,int);
宏展开成( *(int *)((x += _INTSIZEOF(int)) - _INTSIZEOF(int)) )
此时x指向下一个参数(x = x + _INTSIZEOF(int))
然后x再减去_INTSIZEOF(int)得到x未改变前的地址,
再将x所指向的int类型的值赋给y

也就就是说y取得x所指向的int类型的值,然后x指向下一个参数地址
[解决办法]
加了,没减回去。
注意,是:
(ap += _INTSIZEOF(t)) - _INTSIZEOF(t)
而不是:
(ap + _INTSIZEOF(t)) - _INTSIZEOF(t)

这两者当然不一样了。
主要是ap变了,下一次再取下一个参数时,就不会仍然取到先前的那个了,这就够了。
[解决办法]
先辈的技巧. 你取一次值,指针就自动变一次.如果分成两步就好懂了.
[解决办法]
-_-
[解决办法]
呵呵,或许在他们看来,那样也没有不明了。
库里的东西嘛。只要他们自已读起来没有障碍就行了。

热点排行