Like Share Discussion Bookmark Smile

J.J. Huang   2019-11-22   C   瀏覽次數:

C語言 - 第二十九章 | 函式進階議題 - 不定長度引數(Variable-length argument)

不定長度引數(Variable-length argument)

在定義函式時,有時無法事先得知要傳遞的參數個數,這邊介紹不定長度引數(Variable-length argument)的使用,為了要使用不定長度引數,必須包含stdarg.h標頭檔案。

1
#include <stdarg.h>

不定長度引數使用幾個識別字來建立不定長度引數:

名稱 說明
va_list 一個特殊的型態(type),在 va_start、 va_arg 與 va_end 三個巨集(macro)中當作參數使用。
va_start 啟始不定長度引數的巨集。
va_arg 讀取不定長度引數的巨集。
va_end 終止不定長度引數的巨集。

在宣告不定長度引數時,函式定義時要使用`...`表示將使用不定長度引數,而之前必須告知將傳遞幾個不定長度引數。
1
void foo(int, ...);

在使用va_arg巨集取出引數內容時,必須指定將以何種資料型態取出。

1
va_arg(num_list, double);

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdarg.h>

void foo(int, ...);

int main() {
double x = 1.1, y = 2.1, z = 3.9;
double a = 0.1, b = 0.2, c = 0.3;

puts("三個參數:");
foo(3, x, y, z);

puts("六個參數:");
foo(6, x, y, z, a, b, c);

return 0;
}

void foo(int len, ...) {
va_list args;
va_start(args, len);

for(int j = 0; j < len; j++) {
printf("%.1f\n", va_arg(args, double));
}

va_end(args);
}
1
2
3
4
5
6
7
8
9
10
11
12
// 結果
三個參數:
1.1
2.1
3.9
六個參數:
1.1
2.1
3.9
0.1
0.2
0.3


註:以上參考了
不定長度引數(Variable-length argument)