C 庫 - va_arg() 宏



C 的stdargva_arg() 宏用於接受可變數量引數的函式,並檢索由va_start 初始化的 va_list(可變引數列表)中的下一個引數。

在使用 va_arg 之前,應使用 'va_start(ap, last_arg)' 或 'va_copy(ap, src_ap)'(如果引數是從另一個 va_list 複製的)初始化型別為 va_list 的物件 ap。兩者之間不應出現對 va_end 的呼叫。

此宏對於可變引數函式非常有用,它從 arg_ptr 指向的位置檢索指定型別的 value,並將 arg_ptr 加 1 以指向列表中的下一個引數。

語法

以下是 va_arg() 宏的 C 庫語法:

type va_arg(va_list ap, type)

引數

此宏接受以下引數:

  • ap - 這是一個由 'va_start' 初始化的 va_list 型別變數。此變數用於遍歷引數列表。

  • type - 它表示我們要檢索的引數型別。它指定列表中下一個引數的資料型別。

返回值

此宏將下一個附加引數作為型別為 type 的表示式返回。

示例 1:數字求和

以下是一個基本的 C 示例,演示了 va_arg() 的用法。

#include <stdarg.h>
#include <stdio.h>

int Sum_of_num(int n, ...) {
   int Sum = 0;
   va_list ptr;
   va_start(ptr, n);
   for (int i = 0; i < n; i++){
      Sum += va_arg(ptr, int);
   }        
   va_end(ptr);
   return Sum;
}
int main() {
   printf("1 + 2 is %d\n", Sum_of_num(2, 1, 2));
   printf("1 + 2 + 3 is %d\n", Sum_of_num(3, 1, 2, 3));
   printf("1 + 2 + 3 + 4 is %d\n", Sum_of_num(4, 1, 2, 3, 4));
   return 0;
}

輸出

以下是輸出:

1 + 2 is 3
1 + 2 + 3 is 6
1 + 2 + 3 + 4 is 10

示例 2:查詢最大數

在這個例子中,我們使用 va_arg() 從傳入的引數中查詢最大數。

#include <stdarg.h>
#include <stdio.h>

int Largest_num(int n, ...) {
   va_list ap;
   va_start(ap, n);
   int max = va_arg(ap, int);
   for (int i = 0; i < n - 1; i++) {
      int temp = va_arg(ap, int);
      max = temp > max ? temp : max;
   }
   va_end(ap);
   return max;
}

int main() {
   printf("%d\n", Largest_num(2, 1, 2));
   printf("%d\n", Largest_num(3, 1, 2, 3));
   printf("%d\n", Largest_num(4, 6, 2, 3, 4));
   return 0;
}

輸出

以下是輸出:

2
3
6

示例 3

讓我們來看另一個例子,建立一個可變引數函式,該函式檢索並列印傳遞給它的每個引數。

#include <stdio.h>
#include <stdarg.h>

void print_numbers(int count, ...) {
   va_list args;

   // Initialize the va_list variable
   va_start(args, count);

   // Retrieve and display each argument
   for (int i = 0; i < count; i++) {
      int num = va_arg(args, int);
      printf("Argument %d: %d\n", i + 1, num);
   }
   // Clean the va_list
   va_end(args);
}
int main() {
   printf("Displaying 3 numbers:\n");
   print_numbers(3, 10, 20, 30);

   printf("\nDisplaying 5 numbers:\n");
   print_numbers(5, 1, 2, 3, 4, 5);

   return 0;
}

輸出

以下是輸出:

Displaying 3 numbers:
Argument 1: 10
Argument 2: 20
Argument 3: 30

Displaying 5 numbers:
Argument 1: 1
Argument 2: 2
Argument 3: 3
Argument 4: 4
Argument 5: 5
廣告