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