va_arg
From cppreference.com
| ヘッダー <stdarg.h> で定義 |
||
| T va_arg( va_list ap, T ); |
||
va_argマクロは、va_list 型の ap から次の引数に対応する、型 T の式に展開されます。
va_arg を呼び出す前に、ap は va_start または va_copy のいずれかの呼び出しによって初期化されている必要があり、その間に va_end の呼び出しがあってはなりません。va_arg マクロの各呼び出しは、次の可変引数を指すように ap を変更します。
もし ap 内の次の引数の型(プロモーション後)が T と互換性がない場合、未定義の動作となります。ただし、以下の場合は除きます。
- 一方の型が符号付き整数型で、もう一方が対応する符号なし整数型であり、かつその値が両方の型で表現可能である場合。
- 一方の型が void へのポインタで、もう一方が文字型へのポインタである場合。
va_arg が ap 内に引数がなくなった状態で呼び出された場合、未定義の動作となります。
目次 |
[編集] パラメータ
| ap | - | va_list 型のインスタンス |
| T | - | ap 内の次のパラメータの型 |
[編集] 展開された値
ap 内の次の可変引数
[編集] 例
このコードを実行
#include <math.h> #include <stdarg.h> #include <stdio.h> double stddev(int count, ...) { double sum = 0; double sum_sq = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { double num = va_arg(args, double); sum += num; sum_sq += num*num; } va_end(args); return sqrt(sum_sq / count - (sum / count) * (sum / count)); } int main(void) { printf("%f\n", stddev(4, 25.0, 27.3, 26.9, 25.7)); }
出力
0.920258
[編集] 参考文献
- C23標準 (ISO/IEC 9899:2024)
- 7.16.2.2 The va_arg macro (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.16.1.1 The va_arg macro (p: TBD)
- C11標準 (ISO/IEC 9899:2011)
- 7.16.1.1 The va_arg macro (p: 269-270)
- C99標準 (ISO/IEC 9899:1999)
- 7.15.1.1 The va_arg macro (p: 249-250)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.8.1.2 The va_arg macro
[編集] 関連項目
| (C99) |
可変長引数のコピーを作成する (関数マクロ) |
| 可変長引数の走査を終了する (関数マクロ) | |
| va_start、va_arg、va_end、va_copy で必要とされる情報を保持する (typedef) | |
| 可変長引数関数へのアクセスを有効にする (関数マクロ) | |
| C++ のドキュメント (va_arg)
| |