C語言重載函數(shù)之省略符形參
在c++ ?primer書上看到標(biāo)題為“含有可變形參的函數(shù)”的章節(jié),內(nèi)容如下:
省略符形參有下列兩種形式:
void foo ( parm_list , …); ?
void foo ( … );
第一種形式為特定數(shù)目的形參提供了聲明。在這種情況下,當(dāng)函數(shù)被調(diào)用時(shí),對(duì)于與顯示聲明的形參相對(duì)應(yīng)的實(shí)參進(jìn)行類型檢查,而對(duì)于與省略符對(duì)應(yīng)的實(shí)參則暫停類型檢查。在第一鐘形式中,形參聲明后面的逗號(hào)是可選的。
答:
你可以傳遞任意數(shù)量的參數(shù)給他,所以當(dāng)然跟沒有參數(shù)的函數(shù)有區(qū)別了(沒有參數(shù)的函數(shù),你是不可以給他傳遞任何參數(shù)的)。 ?
樓主提醒一點(diǎn):省略號(hào)的優(yōu)先級(jí)別最低,所以在函數(shù)解析時(shí),只有當(dāng)其它所有的函數(shù)都無法調(diào)用時(shí),編譯器才會(huì)考慮調(diào)用省略號(hào)函數(shù)的。
#include#includevoid?ArgFunc(const?char?*str,?...?)? {? ????va_list?ap;? ????int?n?=?3;? ????char?*s?=?NULL;? ????int?d?=?0;? ????double?f?=?0.0;? ????va_start(ap,?str);?//?注意!這里第二個(gè)參數(shù)是本函數(shù)的第一個(gè)形參? ????s?=?va_arg(ap,?char*);? ????d?=?va_arg(ap,?int);? ????f?=?va_arg(ap,?double);?//?浮點(diǎn)最好用double類型,而不要用float類型;否則數(shù)據(jù)會(huì)有問題? ????va_end(ap);? ????printf("%s?is?%s?%d,?%f",?str,?s,?d,?f);? }? void?main()? {? ??????ArgFunc("The?answer",?"Hello",?345,?788.234);? }
對(duì)于void ArgFunc(const char *str, …):
首先,如果要處理不定參數(shù)的函數(shù)要包含頭文件:stdarg.h
然后在處理不定參數(shù)的函數(shù)中先定義一個(gè)參數(shù)列表變量:va_list ap;
第二步:確定不定參數(shù)所在的位置。在這里,第一個(gè)參數(shù)為str,因此要從第二個(gè)參數(shù)進(jìn)行獲取參數(shù)列表。va_start(ap, str);表示在str參數(shù)之后獲取參數(shù)。由于C調(diào)用是從右到左依次將參數(shù)壓入堆棧的,因此處理起來比較容易。
第三步:獲取參數(shù)并指明類型,如:va_arg(ap, char*);獲取第一個(gè)參數(shù),并指明類型為char* ?
在main()函數(shù)中就對(duì)應(yīng)著實(shí)參”hello”;va_arg(ap, int);緊接著再取一個(gè)參數(shù),并指明類型為int,對(duì)應(yīng)main()函數(shù)中的實(shí)參345;va_arg(ap, double);再接著取第三個(gè)參數(shù),并指明類型為double,對(duì)應(yīng)main()中的實(shí)參788.234