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 の呼び出しの前に。
|
|
(C23まで) |
|
|
(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マクロ
関連項目
| 次の可変引数関数の引数にアクセスする (関数マクロ) | |
(C99) |
可変引数関数の引数のコピーを作成する (関数マクロ) |
| 可変引数関数の引数の走査を終了する (関数マクロ) | |
| に必要な情報を保持する va_start、va_arg、va_end、および va_copy (typedef) | |
C++ドキュメント の va_start
| |