1. 程式人生 > >C語言變參函式巨集定義分析

C語言變參函式巨集定義分析

)
bnd一般取3(32位cpu)或7(64位cpu) 。以32位cpu為例:~(bnd) = 0xfffffffc,該值相當於一個掩碼,使任何數與它相與後的結果都是4的倍數,這也正好吻合32位cpu入棧時4位元組對齊的特點;(sizeof (X)) + (bnd) = sizeof(X) + 3,保證了不管引數X實際佔據幾個位元組,表示式除以4取整後的值總是大於等於引數X的實際大小。

2、分析 
#define va_arg(ap, T):
將該巨集定義展開為如下形式:
( *(T *) ( ( (ap) += (_bnd (T, _AUPBND)) ) ( _bnd (T,_ADNBND) )
) )該巨集的功能是:獲得ap指向引數的值,並使ap指向下一個引數,T用來指明當前引數型別。
注意((ap) += (_bnd (T, _AUPBND))) 是被一對括號括起來的,然後才減去(_bnd (T, _ADNBND),所以整個巨集取得的值是ap當前指向的引數值,但是先給ap加了當前引數在字對齊後所佔的位元組數,使其指向了下一個引數。

 3、分析
#define va_end(ap)
(void) 0可能是為了跟va_start(ap, A)  成對出現,也有可能是為了保證函式返回時能正確的恢復棧。(有疑問?)4、分析#define va_start(ap, A)
將該巨集定義展開為如下形式: (void) 
( (ap) = ( ( (char *) &(A) ( _bnd (A,_AUPBND) ) ) )