版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、如何實(shí)現(xiàn)參數(shù)個(gè)數(shù)可變的函數(shù)如何實(shí)現(xiàn)參數(shù)個(gè)數(shù)可變的函數(shù)參數(shù)個(gè)數(shù)不定的函數(shù),最頻繁使用的就是printf()與scanf()。其實(shí),我們也可以自己實(shí)現(xiàn)這樣的功能,首先看一個(gè)例子:#include#includeintSum(intfirstintsecond...)intsum=0t=firstva_listvlva_start(vlfirst)while(t!=1)sum=tt=va_arg(vlint)將當(dāng)前參數(shù)轉(zhuǎn)換為int類(lèi)型va_e
2、nd(vl)returnsumintmain(intargcargv[])printf(“Thesumis%dn“Sum(3020101))1是參數(shù)結(jié)束標(biāo)志return0在上面的例子中,實(shí)現(xiàn)了一個(gè)參數(shù)個(gè)數(shù)不定的求int型和的函數(shù)Sum()。函數(shù)中一開(kāi)始定義了一個(gè)va_list型變量vl,該變量用來(lái)訪問(wèn)可變參數(shù),實(shí)際上就是指針,接著使用va_start使vl指向第一個(gè)參數(shù),然后再使用va_arg來(lái)遍歷每一個(gè)參數(shù),va_arg返回參數(shù)列表中
3、的當(dāng)前參數(shù)并使vl指向參數(shù)列表中的下一個(gè)參數(shù)。最后通過(guò)va_end把vl指針清為NULL。在這里,va_start,va_arg,va_end其實(shí)都是宏,那么這些宏又是如何實(shí)現(xiàn)他們的功能的呢?一個(gè)很顯然的問(wèn)題就是既然參數(shù)個(gè)數(shù)在函數(shù)調(diào)用之前沒(méi)有確定,所以,在函數(shù)定義的時(shí)候沒(méi)有辦法像普通函數(shù)那樣使用確定的變量來(lái)接受傳進(jìn)來(lái)的參數(shù),于是,問(wèn)題的關(guān)鍵就是如何接收到這些不確定的參數(shù)了?首先,看看函數(shù)調(diào)用時(shí)實(shí)際發(fā)生的情況,在函數(shù)調(diào)用的時(shí)候,使用棧傳遞
4、參數(shù),拿上例來(lái)說(shuō),如果調(diào)用Sum(3020101),那么參數(shù)入棧后的情形如下圖所示(假定按照自右至左的順序入棧):既然參數(shù)在棧中的情形已經(jīng)知道了,那么,如果使用指針(程序中的vl)指向第一個(gè)參數(shù)(va_start(vlfirst)),因?yàn)樗袇?shù)都是連續(xù)存放的,通過(guò)移動(dòng)指針就可以訪問(wèn)到每一個(gè)參數(shù)了(va_arg(vlint)),這就是我在程序中使用到那幾個(gè)宏的實(shí)現(xiàn)思想。明白了以上原理之后,就可以完全不使用宏,自己實(shí)現(xiàn)這樣的一個(gè)功能了,下
5、面的程序是我按照上面的思想改寫(xiě)的:#includeintSum(intfirstintsecond...)intsum=0t=firstvl定義一個(gè)指針typefuncname(typepara1typepara2...)這種形式至少需要一個(gè)普通的形式參數(shù),后面的省略號(hào)不表示省略,而是函數(shù)原型的一部分,type是函數(shù)返回值和形式參數(shù)的類(lèi)型。采用與UNIXSystemV兼容的聲明方式時(shí),參數(shù)個(gè)數(shù)可變的函數(shù)原型是:typefuncname(
6、va—alist)va—dcl這種形式不需要提供任何普通的形式參數(shù),type是函數(shù)返回值的類(lèi)型。va—dcl是對(duì)函數(shù)原型聲明中參數(shù)va—alist的詳細(xì)聲明,實(shí)際是一個(gè)宏定義,對(duì)不同的硬件平臺(tái)采用不同的類(lèi)型來(lái)定義,但在最后都包括了一個(gè)分號(hào),因此va—dcl后不再需要加上分號(hào)了。va—dcl在代碼中必須原樣給出,va—alist在VC中可以原樣給出,也可以略去,但在UNIX上的CC或Linux上的GCC中都要省略掉。此外,采用頭文件std
7、arg.h編寫(xiě)的程序是符合ANSI標(biāo)準(zhǔn)的,可以在各種操作系統(tǒng)和硬件上運(yùn)行,而采用頭文件varargs.h的方式僅僅是為了與以前的程序兼容。所以建議大家使用前者。兩種方式的基本原理是一致的,只是在語(yǔ)法形式上有一些細(xì)微的區(qū)別。以下主要就前一種方式對(duì)參數(shù)的處理做出說(shuō)明。va—start使argp指向第一個(gè)可選參數(shù)。va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使argp指向參數(shù)列表中的下一個(gè)參數(shù)。va—end把a(bǔ)rgp指針清為NULL。函數(shù)體內(nèi)可以多
8、次遍歷這些參數(shù),但是都必須以va—start開(kāi)始,并以va—end結(jié)尾。調(diào)用者在實(shí)際調(diào)用參數(shù)個(gè)數(shù)可變的函數(shù)時(shí),要通過(guò)一定的方法指明實(shí)際參數(shù)的個(gè)數(shù),例如把最后一個(gè)參數(shù)置為空字符串(系統(tǒng)調(diào)用execl()就是這樣的)、-1或其他的方式。下面給出一個(gè)具體的例子,前一部分是采用了符合ANSI標(biāo)準(zhǔn)形式的代碼,后一部分是采用了與UNIXSystemV兼容方式的代碼。代碼中加了一些注釋?zhuān)@里就不再解釋了。該例子已經(jīng)在VCWindowsNT4.0、CC
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c語(yǔ)言參數(shù)個(gè)數(shù)可變函數(shù)詳解
- 可變參數(shù)函數(shù)說(shuō)明
- c51參數(shù)可變函數(shù)
- 可變參數(shù)的實(shí)現(xiàn)方式
- 自然數(shù)表整數(shù)個(gè)數(shù)的均值估計(jì).pdf
- 中國(guó)可變參數(shù)的總量生產(chǎn)函數(shù)研究.pdf
- 關(guān)于互素子集個(gè)數(shù)函數(shù)
- 關(guān)于互素子集個(gè)數(shù)函數(shù).pdf
- c語(yǔ)言可變參數(shù)研究
- c語(yǔ)言中可變參數(shù)的用法
- 頭相關(guān)傳遞函數(shù)個(gè)性化方法研究.pdf
- 一個(gè)數(shù)論函數(shù)及其均值
- 如何批量打印可變內(nèi)容的方法
- 如何批量打印可變內(nèi)容的方法
- 復(fù)合函數(shù)的零點(diǎn)個(gè)數(shù)問(wèn)題
- 核函數(shù)的參數(shù)選擇.pdf
- 縱向尺度因子可變的分形插值函數(shù).pdf
- 以字符個(gè)數(shù)為參數(shù)的可滿足性問(wèn)題算法研究
- 如何求函數(shù)的偏導(dǎo)數(shù)?
- 如何深入把握函數(shù)的概念
評(píng)論
0/150
提交評(píng)論