#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 釋放掉

註:

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

參考:
stdarg.h (wiki 網站)

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