[問題] 參數傳遞個數的問題..

看板C_and_CPP (C/C++)作者 (處處留心皆正妹)時間11年前 (2014/12/25 05:39), 編輯推噓0(006)
留言6則, 1人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 問題(Question): 最近在複習C語言時看到了一個習題上的問題 程式碼如下 int foo(); int bar(); int main(void) { foo(2, 3, 4); return 0; } int foo(int a, int b) { return bar(a); } int bar(int c, int d) { int e = c + d; return e; } 我用gcc居然可以編譯成功沒有錯誤訊息也沒有warning... foo原型宣告裡面沒有宣告參數,後面有宣告2個 然後呼叫bar函數居然也沒有錯誤 我轉成組合語言看了一下後,第一次call foo 雖然有把3個參數搬到暫存器去 但是foo函數裡面只有接收到前2個參數,也就是2跟3 然後在call bar時,只有傳2這一個參數過去 但是在bar裡面計算c+d時,居然又用到了2跟 另一個暫存器(值為3) 也就是在 bar裡面 變數e是5 最後覺得會錯誤的程式碼居然可以編譯成功,但程式流程又很怪異 整個不太能理解它的行為.. -- 你的行動或許沒有意義,但你還是非做不可。 這不是為了改變世界,而是為了讓你成為不會被世界改變的那個人. – 甘地(Mahatma Gandhi) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.167.63.16 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1419457149.A.15D.html

12/25 08:57, , 1F
int foo(); 在C是一個宣告不定參數的函數
12/25 08:57, 1F

12/25 08:57, , 2F
如果要宣告一個沒有參數的函數 要用int foo(void);
12/25 08:57, 2F

12/25 09:04, , 3F
如果你開-Wstrict-prototypes就會出現這個warning了
12/25 09:04, 3F

12/25 09:04, , 4F
(-Wstrict-prototypes不包含在-Wall -Wextra裡面)
12/25 09:04, 4F

12/25 09:05, , 5F
不過gcc/clang -Wall -Wextra -pedantic和clang的static
12/25 09:05, 5F

12/25 09:05, , 6F
analyzer都抓不出後面的錯誤是還蠻扯的=.=
12/25 09:05, 6F
文章代碼(AID): #1Kcp9z5T (C_and_CPP)
文章代碼(AID): #1Kcp9z5T (C_and_CPP)