名前空間
変種
操作

va_start

From cppreference.com
ヘッダー <stdarg.h> で定義
void va_start( va_list ap, parmN );
(C23まで)
void va_start( va_list ap, ... );
(C23以降)

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

va_start は、va_arg の呼び出しの前に、有効な va_list オブジェクト ap のインスタンスとともに呼び出される必要があります。

parmNregister ストレージクラス指定子で宣言されている場合、配列型である場合、関数型である場合、またはデフォルト引数プロモーションの結果となる型と互換性のない型である場合、動作は未定義です。

(C23まで)

va_start に渡された最初の引数のみが評価されます。追加の引数は展開されたり、いかなる方法でも使用されたりしません。

(C23以降)

目次

[編集] パラメータ

ap - va_list 型のインスタンス
parmN - 最初の可変引数の前の名前付き引数

[編集] 展開された値

(なし)

[編集]

#include <stdio.h>
#include <stdarg.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

[編集] 参照

  • C17標準 (ISO/IEC 9899:2018)
  • 7.16.1.4 The va_start macro (p: 198-199)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.16.1.4 The va_start macro (p: 271-272)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.15.1.4 The va_start macro (p: 251-252)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.8.1.1 The va_start macro

[編集] 関連項目

次の可変長引数にアクセスする
(関数マクロ) [編集]
可変長引数のコピーを作成する
(関数マクロ) [編集]
可変長引数の走査を終了する
(関数マクロ) [編集]
va_startva_argva_endva_copy で必要とされる情報を保持する
(typedef) [編集]
English 日本語 中文(简体) 中文(繁體)