#include <stdarg.h>
int my_function(int cnt, char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
...
x = va_arg(ap, int); // 取得一個整數變數
...
*va_arg(ap, long *) = y; // 把一個長整數指標變數塞回去
...
va_end(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 是最後一個具名參數, 至少必需有一個具名參數, 所以不可以只宣告 abc(...);
- ... 表示接下來的參數是可有可無的
va_list ap;
- 宣告變動參數使用的變數 ap (型態一定是 va_list)
va_start(ap, fmt);
- 把變數 ap 指到第一個變動參數, (第二個參數請給定最後一個具名參數, 即 fmt)
- 要開始處理變動參數之前要加這一行
x = va_arg(ap, int);
- 取得一個變動參數, 第二個參數 int 指定要取出一個整數 (所以變動部份不必全部都是相同類型的參數)
- ap 會指向下一個變動參數
*va_arg(ap, long *) = y;
- 把數值存入變動參數所指向的位址, 第二個參數 long* 指定要存入一個長整數指標
- 改變變動參數本身是無意義的, 但改變指標型變動參數所指向的變數 (即把值存入指標所指的位址) 是 OK 的.
- ap 一樣會指向下一個變動參數
va_end(ap);
- 程式最後要加這一行, 把 va_list 釋放掉
註:
- 沒有確定的辦法判別變動變數的型態及個數, 所以自己要小心使用
- 常用的方法有:
- 像 printf 或 scanf 的方法
- 或者傳入一個參數指明有多少個參數
- 或者用特定的結尾資料
文章標籤
全站熱搜
留言列表