可變參函數(shù)

例如可變參函數(shù)printf的函數(shù)原型/函數(shù)聲明為:int printf(char *fmt, ...);其中參數(shù)表必須至少包括一個(gè)有名參數(shù)(如fmt);省略號(hào)表示參數(shù)表中參數(shù)的數(shù)量和類型是可變的,且省略號(hào)只能出現(xiàn)在參數(shù)表的尾部。
在標(biāo)準(zhǔn)頭文件<stdarg.h>中包含一組宏定義膛堤,它們對(duì)如何遍歷未知數(shù)目和類型的函數(shù)參數(shù)表進(jìn)行了定義;該頭文件的實(shí)現(xiàn)因不同的機(jī)器而不同柠并,但提供的接口是一致的澜公。主要的宏如下:

void va_start(va_list ap,lastarg);
type va_arg(va_list ap,type);
void va_end(va_list ap);
  1. va_list: va_list類型用于聲明一個(gè)變量ap,該變量將依次引用變長(zhǎng)參數(shù)列表中各參數(shù)萍歉,定義為typedef char *va_list侣颂。
  2. va_start:宏va_start將ap初始化為指向第一個(gè)無(wú)名參數(shù);lastarg為最后一個(gè)有名參數(shù)枪孩。
  3. va_arg:va_arg將返回ap指向的參數(shù)憔晒,并將ap指向下一個(gè)參數(shù);va_arg使用一個(gè)類型名(type)來(lái)決定返回的對(duì)象類型蔑舞、ap移動(dòng)的步長(zhǎng)拒担。
  4. va_end:最后必須在函數(shù)返回前調(diào)用va_end,以完成一些必要的清理工作攻询。(va:variable argument)
  5. 在沒(méi)有函數(shù)原型的情況下从撼,char與short類型都將轉(zhuǎn)換為int類型;float類型將被轉(zhuǎn)換為double類型钧栖。實(shí)際上低零,用...標(biāo)識(shí)的可變參總是會(huì)執(zhí)行這種類型提升(Type Promotions)。

一個(gè)簡(jiǎn)單可變參數(shù)函數(shù):

#include<stdio.h>
#include<stdarg.h>

void f(char *fmt, ...);

int main(void)
{
  printf("f is a variable argument function \n");
  f("%s,%s,%s,%s,%s,%s","f","is","a","variable","argument","function");
  return 0;
}

void f(char *fmt, ...)
{
  va_list ap;  /*聲明一個(gè)引用變長(zhǎng)參數(shù)的變量*/
  va_start(ap,fmt);  /*將ap初始化為指向第一個(gè)無(wú)名參數(shù)*/
  int i=1;
  char *p=fmt;
  while(*p){
    if('%'==*p && 's'==*(p+1))
    printf("%s is #%d parameter\n",va_arg(ap,char *),++i);  /*va_arg將返回ap指向的參數(shù)拯杠,并將ap指向下一個(gè)參數(shù)*/ 
    p++;
  }
  va_end(ap);  /*函數(shù)返回前調(diào)用va_end*/
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏婶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潭陪,更是在濱河造成了極大的恐慌雄妥,老刑警劉巖最蕾,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茎芭,居然都是意外死亡揖膜,警方通過(guò)查閱死者的電腦和手機(jī)誓沸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門梅桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拜隧,你說(shuō)我怎么就攤上這事宿百。” “怎么了洪添?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵垦页,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我干奢,道長(zhǎng)痊焊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任忿峻,我火速辦了婚禮薄啥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逛尚。我一直安慰自己垄惧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布绰寞。 她就那樣靜靜地躺著到逊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滤钱。 梳的紋絲不亂的頭發(fā)上觉壶,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音件缸,去河邊找鬼铜靶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛停团,可吹牛的內(nèi)容都是我干的旷坦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佑稠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秒梅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舌胶,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捆蜀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辆它,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誊薄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锰茉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呢蔫。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖飒筑,靈堂內(nèi)的尸體忽然破棺而出片吊,到底是詐尸還是另有隱情,我是刑警寧澤协屡,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布俏脊,位于F島的核電站,受9級(jí)特大地震影響肤晓,放射性物質(zhì)發(fā)生泄漏爷贫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一补憾、第九天 我趴在偏房一處隱蔽的房頂上張望漫萄。 院中可真熱鬧,春花似錦余蟹、人聲如沸卷胯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窑睁。三九已至,卻和暖如春葵孤,著一層夾襖步出監(jiān)牢的瞬間担钮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工尤仍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箫津,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓宰啦,卻偏偏與公主長(zhǎng)得像苏遥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赡模,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容