C語言中的隱式函式宣告

2021-08-03 01:38:09 字數 873 閱讀 5733

1 什麼是c語言的隱式函式宣告

在c語言中,函式在呼叫前不一定非要宣告。如果沒有宣告,那麼編譯器會自動按照一種隱式宣告的規則,為呼叫函式的c**產生彙編**。下面是乙個例子:

? 1

2 3 4 5

int main(int argc, char** argv)

單純的編譯上述源**,並沒有任何報錯,只是在鏈結階段因為找不到名為any_name_function的函式體而報錯。

? 1

2 3 4 5

[smstong@centos192 test]gc

c−cm

ain.

c[sm

ston

g@ce

ntos

192tes

t]gcc main.o

main.o: in functionmain':

main.c:(.text+0x15): undefined reference toany_name_function』

collect2: ld 返回 1

之所以編譯不會報錯,是因為c語言規定,對於沒有宣告的函式,自動使用隱式宣告。相當於變成了如下**:

? 1

2 3

4 5

6int any_name_function();

int main(int argc, char** argv)

2 帶來的問題

2.1 隱式宣告函式名稱恰好在鏈結庫中存在,但返回非int型別

前面給出的例子,並不會造成太大影響,因為在鏈結階段很容易發現存在的問題。然而下面這個例子則會造成莫名的執行時錯誤。

? 1

2 3

4 5 6 7

C語言中的隱式函式宣告

在c89中,函式在呼叫前不一定非要宣告。如果沒有宣告,那麼編譯器會自動按照一種隱式宣告的規則,為呼叫函式的c 產生彙編 下面是乙個例子 int main int argc,char ar 單純的編譯上述源 並沒有任何報錯,只是在鏈結階段因為找不到名為any name function的函式體而報錯。...

C語言函式隱式宣告(1)

這段時間,在看中心後台服務軟體原始碼時發現,有很多自定義函式未經 宣告卻能在主程式中被呼叫,主程式中沒有包括上述函式的標頭檔案,我在各個目錄中也找不到上述函式的標頭檔案。這就奇怪了,連使用標準庫函式printf 都要包括標準輸入輸出標頭檔案,何況是自定義函式?這個問題困擾了我很久。前天問中創公司奚鍾...

C語言函式隱式宣告(2)

1 什麼是c語言的隱式函式宣告 在c語言中,函式在呼叫前不一定非要宣告。如果沒有宣告,那麼編譯器會自動按照一種隱式宣告的規則,為呼叫函式的c 產生彙編 下面是乙個例子 int main int argc,char argv 單純的編譯上述源 並沒有任何報錯,只是在鏈結階段因為找不到名為any nam...