發新話題

C++ Gossip - 函式《進階議題》不定長度引數

C++ Gossip - 函式《進階議題》不定長度引數

在定義函式時,有時我們並無法事先得知要傳遞的參數個數,這邊介紹不定長度引數(Variable-length argument)的使用為了要使用不定長度引數,您必須含入cstdarg表頭檔案:
#include <cstdarg>


不定長度引數使用幾個識別字來建立不定長度引數:
  • va_list
一個特殊的型態(type),在va_start、va_arg與va_end三個巨集(macro)時當作參數使用。
  • va_start
啟始不定長度引數的巨集。
  • va_arg
讀取不定長度引數的巨集。
  • va_end
終止不定長度引數的巨集。


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


在使用va_arg巨集取出引數內容時,您必須指定將以何種資料型態取出,例如:
va_arg(num_list, double);


下面這個程式示範如何使用不定長度引數:

#include <iostream>
#include <cstdarg>
using namespace std;

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;

    cout << "三個參數:" << endl;
    foo(3, x, y, z);

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

    return 0;
}

void foo(int i, ...) {
    double tmp;
    va_list num_list;

    va_start(num_list, i);

    for(int j = 0; j < i; j++)
        cout << va_arg(num_list, double) << endl;

    va_end(num_list);
}
執行結果:
三個參數:
1.1
2.1
3.9
六個參數:
1.1
2.1
3.9
0.1
0.2
0.3

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。