在C語言中,函式呼叫前是否必須先宣告?

時間 2021-06-03 01:43:40

1樓:大江

我的理解是,所呼叫函式可能的返回值型別不同占用的記憶體空間大小不一樣的,而返回值是需要放在臨時空間裡的,所以你需要告訴編譯器需要多少的記憶體空間,比如int需要4位元組,double需要8位元組,如果不寫,編譯器假定留出最通用的4位元組給臨時變數。當然這跟規範和標準以及編譯器的實現有關。如果以後哪天規定變了,預編譯可以掃瞄出後面需要返回型別和返回值所需要占用的位元組數,可以自動匹配預留的臨時變數空間那時候說不定程式就算是正確了

2樓:

下面的例子:

intmain

()void

func

()會報錯,如果把func放在main()函式前,在main()呼叫它之前先定義,那麼就ok,why?因為編譯器發現乙個不認識的函式呼叫,不知道該函式的返回型別,就假設為int型別,等後面編譯的時候編譯器看到實際的函式,它認為有兩個同名的函式,乙個是檔案中的函式,乙個是編譯器假設返回int的那個

如何去避免呢:有沒有辦法讓編譯器一開始就知道函式的返回值型別呢?為了防止編譯器假設函式的返回型別,你可以顯式地告訴它。

告訴編譯器函式會返回什麼型別的語句就叫函式宣告。

1.宣告與定義分離

float

func

(int

age);

函式宣告包括:函式名,返回值型別,形參型別,以;結束,沒有函式體.

一旦宣告了函式,編譯器就不需要假設,完全可以先呼叫函式,再定義函式。

對於上面的問題,可以這樣寫:

int main(int argc, char *argvvoid func(); //宣告

func();

return 0;

}void func()

如果有多個這樣的玩意,我們就需要在main函式中一次次的宣告,比較好的方式是可以放在標頭檔案

2.標頭檔案

建立標頭檔案,func.h, 將函式宣告寫在此:

#ifndef intoC_func_h

#define intoC_func_h

void

func

();#endif

然後上面程式就可以在main函式中不用再函式宣告了.

3樓:葉璟

原則上需要,沒有宣告也能編譯過,不過會有warning;

但是每個warning都有存在的價值。

打個比方,你呼叫乙個有兩個引數的函式,如果沒有前置宣告,假如這個函式定義被改成三個引數(函式名不變),依然能編譯通過,只不過執行時會因為堆疊結構被破壞有可能崩掉;如果有前置宣告,編譯的時候會提示傳給函式實參太少的錯誤;

4樓:RednaxelaFX

首先要知道Dev-C++只是乙個IDE。它並不自己實現編譯器,而是預設搭配MinGW版GCC編譯器。

接下來只要看這個問題的高票回答即可:

Implicit function declarations in C

C語言中呼叫函式change data 和data change data 有什麼區別?

眼鏡獒 change data 或者data change data 哪有data change data 這種又傳位址又返回修改過後的值的?傳了位址就可以直接修改值,為什麼要有個多餘的返回值?有了返回值就可以在外面接收,為什麼又要傳乙個多餘的位址? 差乙個賦值操作。assume data is 1...

C語言中既然可以呼叫函式,為什麼還要發明go to語法呢?

雨花 保持跟彙編相容 上古時候一次額外的函式呼叫有很大的效能開銷,我記得很小的時候讀的書裡面還說要盡量合併函式體,節省函式呼叫開銷,不過也不確定他是不是胡說,早年國內計算機技術真不咋地。現在一般都是反過來,能拆成函式的都拆成函式。 陳寧聰 C語言沒有CPS,有了CPS你就可以不要goto了 笑 嚴肅...

c語言是否可以通過呼叫void函式來完成對陣列的賦值?

zr scat 變長陣列啊,c99範疇,vc沒戲,並且陣列在函式引數會退化為指標 如果陣列引數退化成指標,則不知道步長,不行,可以強行傳入步長來搞定 如果只是想初始化為0的話,直接 不必如此麻煩 雲天明 double z不完了麼 void zeros int width,int height,dou...