读书人

求教! #define va_arg(ap,t) ( *(t

发布时间: 2012-02-19 19:43:38 作者: rapoo

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

读书人网 >C语言

热点推荐