不具名的變動參數以 ... 代表之, 並且至少需要一個具名參數. 因此 ... 的前面至少要有一個參數, 超過一個的部份為此函數的固定參數. 下例為不具名變動參數的樣板.
#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 釋放掉.
註:
- 沒有確定的辦法判別變動變數的型態及個數, 所以自己要小心使用
- 常用的方法有:
- 像 printf 或 scanf 的方法
- 或者傳入一個參數指明有多少個參數
- 或者用特定的結尾資料
參考連結
文章標籤
全站熱搜
留言列表