va_arg
來自 cppreference.com
定義於標頭檔案 <stdarg.h> 中 |
||
T va_arg( va_list ap, T ); |
||
va_arg
宏擴充套件為一個型別為 T 的表示式,該表示式對應於來自 va_list ap 的下一個引數。
在呼叫 va_arg
之前,ap 必須透過呼叫 va_start 或 va_copy 進行初始化,並且其間沒有呼叫 va_end。每次呼叫 va_arg
宏都會修改 ap 以指向下一個可變引數。
如果 ap 中下一個引數的型別(經過型別提升後)與 T 不相容,則行為未定義,除非:
- 其中一個型別是有符號整數型別,另一個型別是相應的無符號整數型別,並且該值在兩種型別中都可表示;或者
- 其中一個型別是指向 void 的指標,另一個是指向字元型別的指標。
如果在 ap 中沒有更多引數時呼叫 va_arg
,則行為未定義。
目錄 |
[編輯] 引數
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 va_arg 宏 (p: TBD)
- C17 標準 (ISO/IEC 9899:2018)
- 7.16.1.1 va_arg 宏 (p: TBD)
- C11 標準 (ISO/IEC 9899:2011)
- 7.16.1.1 va_arg 宏 (p: 269-270)
- C99 標準 (ISO/IEC 9899:1999)
- 7.15.1.1 va_arg 宏 (p: 249-250)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 4.8.1.2 va_arg 宏
[編輯] 另請參閱
(C99) |
複製變長函式引數 (函式宏) |
結束變長函式引數的遍歷 (函式宏) | |
儲存 va_start、va_arg、va_end 和 va_copy 所需的資訊 (typedef) | |
啟用對變長函式引數的訪問 (函式宏) | |
C++ 文件 for va_arg
|