[英]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.