名稱空間
變體
操作

va_arg

來自 cppreference.com
定義於標頭檔案 <stdarg.h>
T va_arg( va_list ap, T );

va_arg 宏擴充套件為一個型別為 T 的表示式,該表示式對應於來自 va_list ap 的下一個引數。

在呼叫 va_arg 之前,ap 必須透過呼叫 va_startva_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 宏

[編輯] 另請參閱

複製變長函式引數
(函式宏) [編輯]
結束變長函式引數的遍歷
(函式宏) [編輯]
儲存 va_startva_argva_endva_copy 所需的資訊
(typedef) [編輯]
啟用對變長函式引數的訪問
(函式宏) [編輯]
C++ 文件 for va_arg