變數引數

va_startva_argva_endva_copy 函式實際上是巨集。

一定要始終呼叫 va_start 第一,也是唯一一次,並最後一次通話 va_end,只有一次,在功能上的每一個出口點。不這樣做可能會對你的系統起作用,但肯定不是可移植的,因此會引發錯誤。

注意正確地宣告你的函式,即使用原型,並注意對最後一個非變數引數的限制 (不是 register,不是函式或陣列型別)。宣告只接受可變引數的函式是不可能的,因為至少需要一個非變數引數才能啟動引數處理。

呼叫 va_arg 時,必須請求提升的引數型別,即:

  • short 被提升為 intunsigned 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_tint16_t 這樣的 C99 型別同樣被推廣。

歷史(即 K&R)可變引數處理在 <varargs.h> 中宣告,但不應該使用,因為它已經過時了。標準的可變引數處理(在此描述並在 <stdarg.h> 中宣告)在 C89 中引入; va_copy 巨集是在 C99 中引入的,但在此之前由許多編譯器提供。