部落格:
微網誌:
我們可以從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指向參數清單中的下一個參數;