1. 程式人生 > >C語言變長參數的認識以及宏實現

C語言變長參數的認識以及宏實現

獲取 指針 tar form pos 不定 定義類 ont 認識

1.認識

變長參數是C語言的特殊參數形式。比如例如以下函數聲明:

int printf(const char *format, ....);

如此的聲明表明,printf函數除了第一個參數類型為const char*之外,其後能夠追加隨意數量、隨意類型的參數。

printf的實現,粗略地舉個樣例。

如果lastarg是變長參數函數的最後一個具名參數(比如printf裏的format),那麽在函數內部定義類型的va_list的變量:

va_list ap;

該變量以後將會依次指向各個可變參數。

ap必須用宏va_start初始化一次,使其指向第一個不定參數,當中lastarg

必須是函數的最後一個具名參數。

va_start(ap, lastarg);

此後,能夠使用va_arg宏來獲取當前不定參數的值,並依據當前不定參數的類型將指針移向下一個參數(假如已其其類型為type):

type current = va_arg(ap, type);

在函數結束前。必須用宏va_end來清理現場。

變長參數的實現得益於C語言默認的cdecl調用慣例的自右向左壓棧傳遞方式,個中細節不作詳述。

接下來用宏來實現變長參數。

2.宏實現

C語言變長參數的認識以及宏實現