c 语言多参数函数,C/C++实现多参数函数编程
在C/C++中,我們經(jīng)常會需要實現(xiàn)類似printf這樣的函數(shù),即函數(shù)的參數(shù)個數(shù)是不定的,這個時候就需要用到我們這篇文章講到的方法啦。
首先,我們要知道這種函數(shù),如何來定義。比如我想實現(xiàn)一個函數(shù)能夠支持 fun(“%d”,1);
那么這個函數(shù)的定義實際上如下:
void?fun(const?char?*fmt, …);
其中…的意思是說參數(shù)無法一一列出,所以用…代替,至于怎么解,我們稍后再說。
比較特殊的一點是,如果你希望將上面的函數(shù)定義成一個宏,那么這個宏可以這樣寫:
#define?FUN(fmt, args…)????fun(fmt, ##args)
又假設(shè)你希望宏能夠自動加上換行符,那么可以這樣寫:
#define?FUN(fmt, args…)????fun(fmt“\n”, ##args)
OK,那么函數(shù)定義的問題我們就解決啦,但是怎么來解呢?
C里面提供了va_start,va_arg,va_end這樣幾個函數(shù),解釋如下:
va_start使argp指向第一個可選參數(shù)。va_arg返回參數(shù)列表中的當(dāng)前參數(shù)并使argp指向參數(shù)列表中的下一個參數(shù)。va_end把argp指針清為NULL。函數(shù)體內(nèi)可以多次遍歷這些參數(shù),但是都必須以va_start開始,并以va_end結(jié)尾。
可能只是這樣說并不是很清楚,我們舉個例子。
1、假設(shè)我們現(xiàn)在想要fun實現(xiàn)和printf一樣的功能,那么實際上,我們是不需要把所有解析出來的,我們只有把參數(shù)原樣傳給printf即可,代碼如下:
void?fun(const?char*?fmt,…)
{
va_list ap;
va_start(ap, fmt);//將ap指向fmt后的第一個參數(shù)
vfprintf(stderr,fmt,ap);
va_end(ap);//將ap置為NULL
}
2、假設(shè)我們現(xiàn)在是要將傳入的參數(shù)都取出來,那么我們就要用到va_arg了,代碼如下:
void?fun(const?char*?fmt,…)
{
va_list ap;
va_start(ap, fmt);//將ap指向fmt后的第一個參數(shù)
int?value?=?va_arg(ap,int);//前提是我們知道第一個參數(shù)是int型;指針指向下一個參數(shù)
printf(“value[%d]\n”,value);
va_end(ap);//將ap置為NULL
}
其實到這里大家也就不難發(fā)現(xiàn),我們?nèi)绾文鼙闅v所有的參數(shù)了,只要規(guī)定好最后一個參數(shù)為一個特殊字符,比如說-1,然后判斷到這個值就停止就行
void?fun(const?char*?fmt,…)
{
va_list ap;
va_start(ap, fmt);//將ap指向fmt后的第一個參數(shù)
int?value;
do{
value?=?va_arg(ap,int);//前提是我們知道第一個參數(shù)是int型;指針指向下一個參數(shù)
printf(“value[%d]\n”,value);
}while(value!=-1);
va_end(ap);//將ap置為NULL
}
OK,到此為止,可變參數(shù)的函數(shù)編寫應(yīng)該也就很明了啦~
總結(jié)
以上是生活随笔為你收集整理的c 语言多参数函数,C/C++实现多参数函数编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jupyter command 'not
- 下一篇: 使用tensorflow出现 Impor