首先來看源**,來自:
linux+v2.6.28/include/acpi/platform/acenv.h: (line 274)
typedef
char
*va_list;/*
* storage alignment properties*/#
define _aupbnd (
sizeof
(acpi_native_int)
- 1)
//acpi_native_int 為4位元組(32位)(根據機子字數而定)
#define _adnbnd (
sizeof
(acpi_native_int)
- 1)
/** variable argument list macro definitions*/#
define _bnd(x, bnd)((
(sizeof
(x))
+(bnd))&
(~(bnd)))
#define
va_arg
(ap, t)(*
(t *)(
((ap)+=
(_bnd (t, _aupbnd)))
-(_bnd (t,_adnbnd)))
)#define
va_end
(ap)
(void
) 0#
define
va_start
(ap, a)
(void)(
(ap)=(
((char*)
&(a))+
(_bnd (a,_aupbnd)))
)
首先分析一下_bnd(x, bnd)。
在使用過程中,_bnd(x, bnd)括號內的bnd是乙個固定值:_adnbnd或者_aupbnd。這個值在這裡都是3。
對於x,我們看看下面的例子:
char c;
_bnd(c, bnd) = ((sizeof(c)) + (3)) & (~(3)) = 4&0xfffffffc = 4
int t;
_bnd(t, bnd) = ((sizeof(t)) + (3)) & (~(3)) = 7&0xfffffffc = 4
double d;
_bnd(d, bnd) = ((sizeof(d)) + (3)) & (~(3)) = b&0xfffffffc = 8
char str[15];
_bnd(str, bnd) = ((sizeof(str)) + (3)) & (~(3)) = 0x12&0xfffffffc = 16
_bnd(x, bnd)給出了以4位元組對齊
的變數x
的大小。
下面給出乙個
具體列子:
#
include
#include
double sum_fun(
int num,..
.); //num為引數個數,此函式返回除num外所有引數之和。
int main(
)double sum_fun(
int num,..
.)va_end
(argptr)
;return sum;
}
//
這裡假設 &num = 0xbff69ce0。
首先分析一下va_start(argptr, num):
(void) ((argptr) = ((char *)&num + 4)) 即
argptr = (char *)(0xbff69ce0
) + 4 = (char *)(
0xbff69ce4)即
argptr
指向了下乙個引數的位址。
再來解析 va_arg(argptr, double):
第一次for迴圈:
(* (double*) ((argptr += 8) - 8)) = (*(double *)(
0xbff69ce4
)) 即
取出了第乙個用於計算的引數的數值。
注意:此時argptr的值是:argptr = argptr + 8 =
0xbff69cec,即
指向了下乙個引數的位址
。第二次for迴圈:
(* (double*) ((argptr += 8) - 8)) = (*(double *)(
0xbff69cec
))即取出了第二個用於計算的引數的值。
和第一次取數值一樣,此時的argptr的值也變了,為:
0xbff69cf4。
對,如果有第三個引數,這就是第三個引數的位址。
明白了可變引數的這些取值方法,我們就可以自由使用了。
linux核心可變引數分析
typedef char va list storage alignment properties define aupbnd sizeof acpi native int 1 acpi native int 為4位元組 32位 根據機子字數而定 define adnbnd sizeof acpi ...
SFDR 引數分析
sfdr是訊號系統處理中常用的一項引數,對於評估系統的雜訊水平和adc dac的效能有一定參考意義。sfdr,英文全稱是 spurious free dynamic range,意為無雜散動態範圍。sfdr是指基波強度與最大雜波或諧波的強度之比,所以sfdr值越大則說明系統的雜訊水平越低,靈敏度越高...
SFDR 引數分析
sfdr是訊號系統處理中常用的一項引數,對於評估系統的雜訊水平和adc dac的效能有一定參考意義。sfdr,英文全稱是 spurious free dynamic range,意為無雜散動態範圍。sfdr是指基波強度與最大雜波或諧波的強度之比,所以sfdr值越大則說明系統的雜訊水平越低,靈敏度越高...