stdarg.h trong C

Header file có tên stdarg.h trong Thư viện C định nghĩa một kiểu biến va_list và 3 macro mà có thể được sử dụng để lấy các tham số trong một hàm khi số tham số là chưa được biết (ví dụ như số tham số là có thể biến đổi).

Các biến được định nghĩa trong stdarg.h

Sau đây là kiểu biến được định nghĩa trong stdarg.h:

va_list: Đây là một kiểu phù hợp để lưu trữ thông tin cần thiết bởi ba macro là va_start(), va_arg() và va_end().

Các macro được định nghĩa trong stdarg.h

Bảng dưới liệt kê một số Macro được định nghĩa trong stdarg.h trong Thư viện C:

Macro Mô tả
void va_start(va_list ap, last_arg) Macro này khởi tạo biến ap để được sử dụng với hai macro là va_arg và va_end. Tham số last_arg, là tham số cố định được biết cuối cùng, đang được truyền tới hàm, ví dụ: tham số ở trước ellipsis
type va_arg(va_list ap, type) Macro này thu nhận tham số tiếp theo trong danh sách tham số của hàm với kiểu type
void va_end(va_list ap) Macro này cho phép một hàm có số tham số biến đổi mà sử dụng macro là va_start để trả về. Nếu va_end không được gọi trước khi trả về từ hàm đó, thì kết quả là không được định nghĩa

1. Macro va_start() trong C

Macro void va_start(va_list ap, last_arg) trong Thư viện C khởi tạo biến ap để được sử dụng với hai macro là va_arg và va_end. Tham số last_arg, là tham số cố định được biết cuối cùng, đang được truyền tới hàm, ví dụ: tham số ở trước ellipsis.

Macro này phải được gọi trước khi sử dụng va_arg và va_end.

Khai báo Macro va_start() trong C

Dưới đây là phần khai báo cho va_start() macro.

void va_start(va_list ap, last_arg);

Tham số

ap − Đây là đối tượng của va_list và nó giữ thông tin cần thiết để thu được các tham số bổ sung với va_arg.

last_arg − Đây là tham số cố định được biết cuối cùng đang được truyền tới hàm.

Trả về giá trị

Macro này không trả về bất kỳ giá trị nào.

Ví dụ

Chương trình C sau minh họa cách sử dụng của va_start() macro.

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

int sum(int, ...);

int main(void)
{
   printf("Tong cua 15, 25 va 35 = %d\n",  sum(3, 15, 25, 35) );
   printf("Tong cua 5, 10, 15 va 20 = %d\n",  sum(4, 5, 10, 15, 25) );

   return 0;
}

int sum(int num_args, ...)
{
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++)
   {
      val += va_arg(ap, int);
   }
   va_end(ap);
 
   return val;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

2. Macro va_arg() trong C

Macro type va_arg(va_list ap, type) trong Thư viện C thu nhận tham số tiếp theo trong danh sách tham số của hàm với kiểu type. Macro này không quyết định xem có hay không tham số được thu nhận là tham số được truyền tới hàm.

Khai báo Macro va_arg() trong C

Dưới đây là phần khai báo cho va_arg() macro.

type va_arg(va_list ap, type)

Tham số

ap − Đây là đối tượng của kiểu va_list với thông tin về các tham số bổ sung và trạng thái thu nhận. Đối tượng này nên được khởi tạo bởi một lời gọi ban đầu tới va_start trước khi lời gọi đầu tiên tới va_arg.

type − Đây là tên kiểu. Tên kiểu này được sử dụng như là kiểu của biểu thức, mà macro này mở rộng tới.

Trả về giá trị

Macro này trả về tham số bổ sung như là một biểu thức của kiểu type.

Ví dụ

Chương trình C sau minh họa cách sử dụng của va_arg() macro.

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

int sum(int, ...);

int main()
{
   printf("Tong cua 25 va 52 = %d\n",  sum(2, 25, 52) );
   return 0;
}

int sum(int num_args, ...)
{
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++) 
   {
      val += va_arg(ap, int);
   }
   va_end(ap);
 
   return val;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

3. Macro va_end() trong C

Macro void va_end(va_list ap) trong Thư viện C cho phép một hàm có số tham số biến đổi mà sử dụng macro là va_start để trả về. Nếu va_end không được gọi trước khi trả về từ hàm đó, thì kết quả là không được định nghĩa.

Khai báo Macro va_end() trong C

Dưới đây là phần khai báo cho va_end() macro.

void va_end(va_list ap)

Tham số

ap − Đây là đối tượng va_list được khởi tạo trước đó bởi va_start trong cùng hàm.

Trả về giá trị

Macro này không trả về bất cứ giá trị nào.

Ví dụ

Chương trình C sau minh họa cách sử dụng của va_end() macro.

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

int mul(int, ...);

int main()
{
   printf("11 * 15 = %d\n",  mul(2, 11, 15) );
   
   return 0;
}

int mul(int num_args, ...)
{
   int val = 1;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++) 
   {
      val *= va_arg(ap, int);
   }
   va_end(ap);
 
   return val;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả: