?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
在頭文件<stdarg.h>中定義 | ||
---|---|---|
T va_arg(va_list ap,T); |
va_arg宏擴(kuò)展為與va_list ap中的下一個(gè)參數(shù)相對應(yīng)的類型T的表達(dá)式。
在調(diào)用va_arg之前,ap必須通過調(diào)用va_start或va_copy來初始化,而不需要中介調(diào)用va_end。 每次調(diào)用va_arg宏都會修改ap以指向下一個(gè)變量參數(shù)。
如果在ap中沒有更多參數(shù)時(shí)調(diào)用va_arg,或者ap(促銷后)中的下一個(gè)參數(shù)的類型與T不兼容,則行為是未定義的,除非:
一種類型是有符號整數(shù)類型,另一種類型是相應(yīng)的無符號整數(shù)類型,并且值可以在兩種類型中表示; 要么
一種類型是指向void的指針,另一種是指向字符類型的指針。
ap | - | 一個(gè)va_list類型的實(shí)例 |
---|---|---|
? | - | ap中下一個(gè)參數(shù)的類型 |
ap中的下一個(gè)可變參數(shù)。
#include <stdio.h>#include <stdarg.h>#include <math.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
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.16.1.1 va_arg宏(p:269-270)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.15.1.1 va_arg宏(p:249-250)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.8.1.2 va_arg宏
va_copy(C99) | 制作可變參數(shù)函數(shù)參數(shù)(函數(shù)宏)的副本 |
---|---|
va_end | 結(jié)束可變參數(shù)函數(shù)參數(shù)的遍歷(函數(shù)宏) |
va_list的 | 保存va_start,va_arg,va_end和va_copy(typedef)所需的信息 |
va_start | 允許訪問可變參數(shù)函數(shù)參數(shù)(函數(shù)宏) |