天天看點

C語言可變長參數實作原理

部落格:

微網誌:           

我們可以從c語言的printf得出可變參數的作用,printf函數的原型如下:

通過使用可變個數參數,就是傳入的參數個數是可變的,如printf需要根據format實參傳入多個實參。

下面一個函數myprintf是自己實作的比較簡單的printf函數,不完整但是可以說明可變參數的用法。

程式的資料結果如下:

下面介紹c語言可變長度參數的實作,其實作與一個資料結構(va_list)和三個宏(va_start, va_end, va_arg)相關,從源碼中可以看到這些實作下面的來自linux核心源碼中的檔案(include/acpi/platform/acenv.h)

 a)         va_list

從實作中可以看出va_list類型實際上就是一個指針;

b)        va_start

這個宏的作用是将t所指向的參數後面的内容放到ap中,其中_bnd (a,_aupbnd)是傳回a的size并與系統的機器位數對齊,因為參數在棧中的位址一定是與系統的字長對齊的,其中acpi_native_int就表示機器字長;

c)         va_end

這個宏的作用就是傳回0;

d)        va_arg

這個宏的作用是取得ap指向的目前的參數,并将ap指向參數清單中的下一個參數; 

繼續閱讀