1. 程式人生 > 其它 >C語言函式的變長引數

C語言函式的變長引數

可變長引數就是函式的引數數量是可變的

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; }