va_list
va_list 用于 C 語言實(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ù)開始解析践瓷,再利用 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è)透明的對象使用即可,第二個(gè)參數(shù) param_n
簡單理解就是第一個(gè)可變參數(shù)的前一個(gè)參數(shù)双饥,也就是 ...
之前的那個(gè)參數(shù)變量名媒抠,但這個(gè)參數(shù)有更深刻的意義,由于函數(shù)的參數(shù)數(shù)量是可變的咏花,如何確定函數(shù)調(diào)用者到底傳了多少個(gè)參數(shù)呢趴生?param_n
就是用來確定函數(shù)可變參數(shù)的數(shù)量,param_n
可以直接代表后續(xù)參數(shù)的數(shù)量,例如上述的 count
苍匆,也可以類似 printf() 函數(shù)刘急,用一個(gè) format 字段來確定后續(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 透明對象民轴,第二個(gè)參數(shù) T
是類型攻柠,并且其決定了該函數(shù)返回值的類型,T
可以是 int, unsigned int, char, void * 等等后裸。
T va_arg( va_list ap, T );