1.可變引數函式
可變引數函式,顧名思義,即函式的引數個數是可變的,例如 printf 的函式原型是:
int printf ( const char * format, ... );
可變引數函式的宣告形式基本類似:只是在引數列表最尾部有乙個引數 format 和 乙個可變引數標誌(三個點「…」)
2.相關的巨集
在實現可變引數函式時,通常會用到以下幾個巨集:
void va_start(va_list ap, argn);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
使用這些巨集需要包含標頭檔案 stdarg.h。
在上述巨集中:
va_list:用於遍歷可變引數列表的變數型別
va_start:初始化 va_list 型別的物件 ap,使其指向呼叫 va_arg 之前的引數列表起始處
va_arg:返回 ap 指向的引數列表中的下乙個引數,且每次呼叫 va_arg 都會修改 ap 使其指向下一引數,使得引數能依序返回
va_end:用於清理工作,使 ap 失效
va_copy:用於拷貝 va_list 的內容
在操作可變引數列表之前,必須先呼叫巨集 va_start 或者 va_copy。
3.乙個例子
以下是 execl 的乙個可能的實現:
#include
#define maxargs 31
/* * execl is called by
* execl(file, arg1, arg2, ..., (char *)(0));
*/int execl(const char *file, const char *args, ...)
array[argno] = (char *) 0;
va_end(ap);
return execv(file, array);
}
在上述實現中,使用乙個空指標來標誌引數列表的末尾,而在其他一些函式中,可以使用格式化字串來明確引數個數或者在尾端加上乙個特定的引數作為標誌。
4.注意事項
C語言函式可變引數總結 stdarg h
stdarg.h標頭檔案中定義了一系列巨集以及資料物件,用於支援可變引數的函式。主要有 va list 定義的資料物件 用於存放可變引數列表 省略號部分 代表的參量 va start ap,v 用於將可變引數列表中第乙個參量的位址複製給va list定義的資料物件 va arg ap,t 用於訪問可...
C語言函式可變引數
翻apue的時候,看到了一組可變引數的巨集就是va list 類似 void print arg int count,1 va list變數 ifdef m alpha typedef struct va list else typedef char va list 這個 endif 2 intsi...
C語言可變引數函式
今天在c和指標書中第一次接觸到這個函式,以前有碰到過這樣可變引數的問題,但無從下手。原來c語言還是有這樣的功能,感覺c真是無所不能。c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg pt...