名稱空間
變體
操作

va_start

來自 cppreference.com
定義於標頭檔案 <stdarg.h>
void va_start( va_list ap, parmN );
(直至 C23)
void va_start( va_list ap, ... );
(自 C23 起)

va_start 宏啟用對可變引數的訪問,緊隨命名引數 parmN 之後(直到 C23)

在呼叫任何 va_arg 之前,必須使用有效的 va_list 物件 ap 的例項來呼叫 va_start

如果 parmN 被宣告為 register 儲存類說明符、陣列型別、函式型別,或者型別與預設引數提升後的型別不相容,則行為未定義。

(直至 C23)

只有傳遞給 va_start 的第一個引數會被評估。任何附加引數都不會被展開或以任何方式使用。

(自 C23 起)

目錄

[編輯] 引數

ap - va_list 型別的一個例項
parmN - 位於第一個可變引數之前的命名引數

[編輯] 展開值

(無)

[編輯] 示例

#include <stdio.h>
#include <stdarg.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

[編輯] 參考

  • 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 宏

[編輯] 參閱

訪問下一個變長函式引數
(函式宏) [編輯]
複製變長函式引數
(函式宏) [編輯]
結束變長函式引數的遍歷
(函式宏) [編輯]
儲存 va_startva_argva_endva_copy 所需的資訊
(型別定義) [編輯]
C++ 文件 關於 va_start