簡體   English   中英

C中函數調用中的默認參數

[英]default parameters in function call in C

讓我們說在一個文件中,我在同一個項目的兩個文件中有一些代碼

file1.c
int func1(int a, int b, int c, bool d)
{
        /* function body */
}

file2.c
extern func1(int a, int b, int c);

/* function call */
func1(runtime1, runtime2, runtime3);

從file2.c調用時bool d會有什么價值? 我知道這是非常糟糕的做法,但是我維護舊代碼並且有人這樣做了,我只是想知道默認參數或者它是否依賴於實現。 另請注意,此示例中的bool是軟件的typedef,因為此特定項目不支持C99。 謝謝。!

價值不僅僅取決於實施; 程序的整個行為是未定義的。 如果你把func1的聲明放在一個頭而不是file2.c並且你在file1.c包含那個頭,那么好的C實踐,編譯器會拒絕編譯它。

在實踐中,您可能會觀察到d具有一些任意的,不可預測的值,盡管您的程序可能也會神秘地崩潰。

該值將是未定義的。 調用func1時,其參數將進入堆棧。 如果用少參數調用它,則堆棧的sizeof(bool)字節將低於進程所期望的值。 這不會使您的程序崩潰,因為您的堆棧和堆正在“面對”,但如果您嘗試訪問d ,您將訪問堆棧中的任何值 - >垃圾。

該程序是未定義的行為 由於程序是未定義的行為,編譯器有權拒絕編譯它。

(C99,6.2.7p2)“所有引用相同對象或函數的聲明都應具有兼容類型;否則,行為未定義。”

程序中的兩個函數聲明不兼容; 它們沒有相同數量的參數。

(C99,6.7.5.3p15)“對於要兼容的兩種函數類型,兩者都應指定兼容的返回類型。此外,參數類型列表(如果兩者都存在)應在參數數量和省略號終止符的使用中一致;相應的參數應具有兼容的類型。“

它可以是任何值,來自堆棧的垃圾我相信如果你這樣調用方法。

程序將具有未定義的行為,因為您實際上不知道bool參數的值。 它也可能在執行期間崩潰。

希望能幫助到你。

它是未定義的行為 - 它可能有垃圾值,它也可能崩潰,取決於編譯器和操作系統的調用約定。

編輯:如果從左到右推送其他參數,則其他參數也可以混合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM