関数定義に関する質問 (パラメーターの 3 つのドット..)

これらのタイプの関数は変数関数と呼ばれます (ウィキペディアへのリンク)。省略記号 (つまり、3 つのドット) を使用して、関数が処理できる引数の数が可変であることを示します。おそらくそのような関数を (おそらく気付かずに) 使用したことがある場所の 1 つは、さまざまな printf を使用することです。 関数、たとえば (ISO 標準から):

int printf(const char * restrict format, ...);

省略記号を使用すると、パラメーターの数が事前にわからない関数を作成でき、stdargs.h を使用できます。 関数 (va_startva_argva_end ) 特定の引数を取得します。

種類を知っておく必要があります 抽出した引数の中で、いつ終了するかを決定する何らかの方法があります。 printf 関数はこれをフォーマット文字列 (タイプとカウントの両方) で行いますが、以下のコード例では常に const char * を想定しています。 センチネル値 NULL を持つ型として 完了を決定します。

このリンク ここには、 printf での可変引数リストの使用に関する優れた論文があります .

例として、次のプログラムには関数 outStrings() が含まれています。 、任意の数の文字列を出力できます:

#include <stdio.h>
#include <stdarg.h>

void outStrings(const char *strFirst, ...) {
    // First argument handled specially.

    printf("%s", strFirst);
    va_list pArg;
    va_start(pArg, strFirst);

    // Just get and process each string until NULL given.

    const char *strNext = va_arg(pArg, const char *);
    while (strNext != NULL) {
        printf("%s", strNext);
        strNext = va_arg(pArg, const char *);
    }

    // Finalise processing.

    va_end(pArg);
}

int main(void) {
    char *name = "paxdiablo";
    outStrings("Hello, ", name, ", I hope you're feeling well today.\n", NULL);
}

C++ の可変引数関数に関するウィキペディア。


それらは省略記号と呼ばれ、関数が不定の数のパラメーターを取ることができることを意味します。関数はおそらく次のように呼び出すことができます:

abc( "foo", 0 );
abc( "foo", "bar", 0 );

リストの終わりを示す方法が必要です。これは、printf(0 フォーマット文字列のように最初のパラメーターを使用するか、上記の例では特殊なターミネーター (ゼロ) を使用することで実行できます。

可変数のパラメーターを持つ関数は、パラメーターに対して型チェックやユーザー定義の変換を実行できないため、C++ では不適切な形式と見なされます。