2020 11 28(不定引數的函式)

2021-10-10 23:11:52 字數 548 閱讀 5191

c\c++將不定長引數的函式定義為:

a.至少要有乙個引數;

b.所有不定長的引數型別傳入時都是dword型別;

c.需在某乙個引數中描述引數的總個數或將最後乙個引數賦值為結尾標記。

有了這三個特性,就可以是實現不定引數的函式。(printf函式就是利用第乙個引數來獲取引數總個數的,只需要檢查printf函式中第乙個引數指向的字串中包含幾個「%」就可以確定其後的引數個數(「%%」形成的轉義字元除外))

根據引數的傳遞特性,只要確定第乙個引數的位址,對其位址值做加法,就可訪問到此引數的下乙個引數所在的位址。獲取引數的型別為了解釋位址中的資料。上面提到的第三點就是為了獲取引數的個數,其目的是正確訪問到最後乙個引數的位址,以防止訪問引數空間越界。

應用:_cdecl:c\c++預設的呼叫方式,呼叫方平衡棧,不定引數的函式可以使用

_stdcall:被呼叫方平衡棧,不定引數的函式無法使用

_fastcall:暫存器方式傳參,被呼叫方平衡棧,不定引數的函式無法使用

不定引數函式

引數的儲存位置 實參在傳遞值時,給形參申請空間並賦值,其形參在位址上形參的位址是相鄰的 根據編譯器和系統環境可能會有所不同 a b 4 sizeof int 乙個int位元組 int func int a,int b 正如上文所說,如果每次通過p 定址,程式的不具有良好的可移植性。c語言有乙個標頭檔...

函式不定引數

函式引數是以資料結構 棧的形式訪問,從右至左入棧.1.va list用於宣告乙個變數,我們知道函式的可變引數列表其實就是乙個字串,所以va list才被宣告為字元型指標,這個型別用於宣告乙個指向引數列表的字元型指標變數,例如 va list ap ap arguement pointer 2.va ...

不定長引數函式的實現

原始碼如下 int sum int num,return ret int main int argc,char argv 所謂不定長引數,就是函式的形參數量不定,型別也可能是不定的。我們把像上面的函式sum中如 int num 這樣的引數叫做 有名引數 後面用 代表的都是 匿名引數 有名引數是可以在...