Namespaces
Variants

va_start

ja.cppreference.net から
ヘッダで定義 <stdarg.h>
void va_start( va_list ap, parmN );
(C23まで)
void va_start( va_list ap, ... );
(C23から)

va_start マクロは、可変引数へのアクセスを可能にします名前付き引数 parmN(C23まで) に続く。

va_start は、有効な va_list オブジェクトのインスタンスを指定して呼び出されなければなりませんap。va_arg の呼び出しの前に。

parmN が register 記憶クラス指定子、配列型、関数型、またはデフォルト引数昇格の結果の型と互換性のない型で宣言された場合、動作は未定義です。

(C23まで)

va_start に複数の引数が存在する場合、2番目以降の引数を構成するプリプロセッサトークンは破棄されます。それらの引数のいずれかが不均衡な括弧を含むように展開されるか、トークンに変換されないプリプロセッサトークンを含む場合、動作は未定義です。

(C23から)

引数

ap - va_list 型のインスタンス
parmN - 最初の可変引数の前にある名前付きパラメータ

展開値

(なし)

例

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

int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count can be omitted since C23
    
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}

#if __STDC_VERSION__ > 201710L
// Same as above, valid since C23
int add_nums_C23(...)
{
    int result = 0;
    va_list args;
    va_start(args);
    
    int count = va_arg(args, int);
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    
    va_end(args);
    return result;
}
#endif

int main(void)
{
    printf("%d\n", add_nums_C99(4, 25, 25, 50, 50));
#if __STDC_VERSION__ > 201710L
    printf("%d\n", add_nums_C23(4, 25, 25, 50, 50));
#endif
}

出力例:

150
150

参考文献

  • C23標準 (ISO/IEC 9899:2024):
  • 7.16.1.4 va_startマクロ (p: 290-292)
  • C17標準 (ISO/IEC 9899:2018):
  • 7.16.1.4 va_startマクロ (p: 198-199)
  • C11標準 (ISO/IEC 9899:2011):
  • 7.16.1.4 va_startマクロ (p: 271-272)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.15.1.4 va_startマクロ (p: 251-252)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.8.1.1 va_startマクロ

関連項目

次の可変引数関数の引数にアクセスする
(関数マクロ)
可変引数関数の引数のコピーを作成する
(関数マクロ)
可変引数関数の引数の走査を終了する
(関数マクロ)
に必要な情報を保持する va_start、va_arg、va_end、および va_copy
(typedef)