變數引數
va_start
,va_arg
,va_end
和 va_copy
函式實際上是巨集。
一定要始終呼叫 va_start
第一,也是唯一一次,並最後一次通話 va_end
,只有一次,在功能上的每一個出口點。不這樣做可能會對你的系統起作用,但肯定不是可移植的,因此會引發錯誤。
注意正確地宣告你的函式,即使用原型,並注意對最後一個非變數引數的限制 (不是 register
,不是函式或陣列型別)。宣告只接受可變引數的函式是不可能的,因為至少需要一個非變數引數才能啟動引數處理。
呼叫 va_arg
時,必須請求提升的引數型別,即:
short
被提升為int
(unsigned short
也被提升為int
,除非sizeof(unsigned short) == sizeof(int)
,在這種情況下它被提升為unsigned int
)。float
晉升為double
。signed char
晉升為int
;unsigned char
也被提升為int
,除非sizeof(unsigned char) == sizeof(int)
,這種情況很少發生。char
通常被提升為int
。- 像
uint8_t
或int16_t
這樣的 C99 型別同樣被推廣。
歷史(即 K&R)可變引數處理在 <varargs.h>
中宣告,但不應該使用,因為它已經過時了。標準的可變引數處理(在此描述並在 <stdarg.h>
中宣告)在 C89 中引入; va_copy
巨集是在 C99 中引入的,但在此之前由許多編譯器提供。