C語言函式的變長引數
阿新 • • 發佈:2021-10-08
可變長引數就是函式的引數數量是可變的
C語言可變引數通過三個巨集(va_start、va_end、va_arg)和一個型別(va_list)實現的。
<stdarg.h> 中有相關定義:
typedef char* va_list; // va_list 是一個字元指標,可以理解為指向當前引數的一個指標,取參必須通過這個指標進行 void va_start ( va_list ap, prev_param ); /* ANSI version */ type va_arg ( va_list ap, type ); void va_end ( va_list ap );
<Step 1> 在呼叫引數表之前,定義一個va_list 型別的變數,(假設va_list 型別變數被定義為ap);
<Step 2> 然後應該對ap 進行初始化,讓它指向可變引數表裡面的第一個引數,這是通過 va_start 來實現的,第一個引數是 ap 本身,第二個引數是在變參表前面緊挨著的一個變數,即“...”之前的那個引數;
<Step 3> 然後是獲取引數,呼叫va_arg,它的第一個引數是ap,第二個引數是要獲取的引數的指定型別,然後返回這個指定型別的值,並且把 ap 的位置指向變參表的下一個變數位置;
<Step 4> 獲取所有的引數之後,我們有必要將這個 ap 指標關掉,以免發生危險,方法是呼叫 va_end,他是輸入的引數 ap 置為 NULL。通常va_start和va_end是成對出現。
程式碼示例:
#include <stdio.h> #include <stdarg.h> void HandleVarargs(int argc, ...) { // 1. 建立一個 va_list 型別變數 args, 用於獲取變長引數. va_list args; // 2. 初始化可變引數列表 va_start(args, argc); for (int i = 0; i < argc; ++i) { // 3. 取出對應引數(va_list, type), 指標後移 int arg = va_arg(args, int); printf("%d: %d\n", i, arg); } // 4. 完成清理工作 va_end(args); } int main() { HandleVarargs(4, 1, 2, 3, 4); return 0; }