C語言變長參數的認識以及宏實現
阿新 • • 發佈:2017-07-30
獲取 指針 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語言變長參數的認識以及宏實現