va_list
va_list 用于 C 語(yǔ)言實(shí)現(xiàn)函數(shù)的可變參數(shù)數(shù)量,例如我們常用的 printf() 函數(shù)內(nèi)部就使用了它。
extern int printf (const char * __format, ...);
在 __format 參數(shù)之后的 ... 代表可變數(shù)量的參數(shù)。
va_list 還需與一些函數(shù)配合使用:
void va_start( va_list ap, parm_n );
T va_arg( va_list ap, T );
void va_end( va_list ap );
使用流程一般是定義一個(gè) va_list 變量,然后調(diào)用 va_start() 函數(shù)開(kāi)始解析,再利用 va_arg() 獲取函數(shù)可變數(shù)量的參數(shù),最后調(diào)用 va_end() 停止解析。一個(gè) demo 如下:
#include <stdio.h>
#include <stdarg.h>
int add_nums(int count, ...)
{
int result = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
result += va_arg(args, int);
}
va_end(args);
return result;
}
int main()
{
printf("%d\n", add_nums(4, 25, 25, 50, 50) );
printf("%d\n", add_nums(4, 25, 25, 50) );
return 0;
}
va_start() 共有兩個(gè)參數(shù),第一個(gè)參數(shù)就是之前定義的 va_list 類型變量 ap,我們將它當(dāng)成一個(gè)透明的對(duì)象使用即可,第二個(gè)參數(shù) param_n 簡(jiǎn)單理解就是第一個(gè)可變參數(shù)的前一個(gè)參數(shù),也就是 ... 之前的那個(gè)參數(shù)變量名,但這個(gè)參數(shù)有更深刻的意義,由于函數(shù)的參數(shù)數(shù)量是可變的,如何確定函數(shù)調(diào)用者到底傳了多少個(gè)參數(shù)呢?param_n 就是用來(lái)確定函數(shù)可變參數(shù)的數(shù)量,param_n 可以直接代表后續(xù)參數(shù)的數(shù)量,例如上述的 count,也可以類似 printf() 函數(shù),用一個(gè) format 字段來(lái)確定后續(xù)參數(shù)數(shù)量,例如 "%d%d%s" 表明后續(xù)有 3 個(gè)可變參數(shù)。
void va_start( va_list ap, parm_n );
為了獲取具體的可變參數(shù)值,就需要使用 va_arg() 函數(shù)了,其第一個(gè)參數(shù) ap 仍是 va_list 透明對(duì)象,第二個(gè)參數(shù) T 是類型,并且其決定了該函數(shù)返回值的類型,T 可以是 int, unsigned int, char, void * 等等。
T va_arg( va_list ap, T );