變數引數
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 中引入的,但在此之前由許多編譯器提供。