不具名的變動參數以 ... 代表之, 並且至少需要一個具名參數. 因此 ... 的前面至少要有一個參數, 超過一個的部份為此函數的固定參數. 下例為不具名變動參數的樣板.

#include <stdarg.h>

int my_function(int cnt, char* fmt, ...)
{
	int ret_value;
	va_list ap;                 // 宣告 變數 ap 型態為 va_list
	va_start(ap, fmt);          // ap 指向第一個變動參數
	...
	x = va_arg(ap, int);        // 取得一個整數變數
	...
	*va_arg(ap, long *) = y;    // 把一個長整數指標變數塞回去
	...
	va_end(ap);                 // 釋放 變數 ap
	...
	return ret_value;
}

int main(void)
{
	...
	my_function(12, "abc", 6, 7, 8);
	...
}

說明:

#include <stdarg.h>

  • 要使用不具名參數之功能必需加入本行, 把標準標頭檔 stdarg.h 加進來.

int my_function(int cnt, char* fmt, ...)

  • 函數的回傳值依實際需要宣告.
  • 此例的第 1 個參數 int cnt 為固定參數 (即: 一定要有的參數). 固定參數依實際需要設置, 需要幾個就寫幾個, 不需要就刪掉.
  • 此例的第 2 個參數 char* fmt 為最後一個具名參數. 由於至少必需有一個具名參數, 所以不可以只宣告 another_func(...);
  • ... 表示接下來的參數是可有可無的.

va_list ap;

  • 宣告變數: 宣告變動參數使用的變數 ap (型態一定是 va_list, 此變數實際上是一指標變數)

va_start(ap, fmt);

  • 初始化變數: 將變數 ap 指到第一個變動參數, (va_start()的第二個參數請給定最後一個具名參數, 即 fmt)
  • 要開始處理變動參數之前要加這一行.

x = va_arg(ap, int);

  • 取得下一組不具名參數值: 取得下一個變動參數. va_arg() 的第二個參數 int 是指定要取出一個整數 (所以變動部份不必全部都是相同類型的參數)
  • ap 會指向下一個變動參數

*va_arg(ap, long *) = y;

  • 回存數值至不具名參數值: 把數值存入變動參數所指向的位址, 第二個參數 long * 指定要存入一個長整數指標.
  • 改變變動參數本身是無意義的 (因為 C 語言為 Call by Value), 但改變指標型變動參數所指向的變數 (即把值存入指標所指的位址) 是 OK 的.
  • ap 一樣會指向下一個變動參數.

va_end(ap);

  • 釋放變數: 程式最後要加這一行, 把 va_list 釋放掉.

註:

  • 沒有確定的辦法判別變動變數的型態個數, 所以自己要小心使用
  • 常用的方法有:
    1. 像 printf 或 scanf 的方法
    2. 或者傳入一個參數指明有多少個參數
    3. 或者用特定的結尾資料

參考連結


arrow
arrow
    創作者介紹
    創作者 MagicJackTing 的頭像
    MagicJackTing

    傑克! 真是太神奇了!

    MagicJackTing 發表在 痞客邦 留言(0) 人氣()