C語言函數聲明什麽時候可以省略,什麽時候不能省?
在學習C語言函數的時候,老師總會告訴我們函數要寫聲明,然後再定義。這是個穩健的做法。等我自己學習了其他高級語言以後,回頭再來寫C,突然就覺得函數要寫聲明有點麻煩。無意間發現有一次函數沒寫聲明居然編譯(GCC 5.3)也通過了,而且都沒有報錯。於是想起來要好好研究一下這個C語言的函數聲明什麽時候可以不寫,什麽時候必須寫。
這其實談不上是技術性問題。就好像討論i++ 和++i那麽無聊。這都是編譯器導致的語法問題。說他們都是歷史遺留問題都不為過。
但是在C語言學習過程中,你不得不去把這些鬼問題弄清楚。這樣在以後面對千奇百怪的C語言代碼的時候才能做到內心毫無波動。
有的書上是這麽說的,如果函數定義放在main函數前面,可以不用寫聲明。如果函數放在main函數後面,就規定要寫函數聲明。這麽說沒毛病。不過我自己又無聊地嘗試了一下,發現了更準確的規則。如果在函數定義在這個函數調用之前,就不需要寫聲明。否則就要寫聲明。
關於這個函數定義的位置其實也是個可以摸索的事情。C語言不允許在一個函數中定義其他函數,但是main函數除外。我發現可以在main函數中定義函數。如果你在main函數中定義函數,如果在函數被調用之前就定義了這個函數,那麽就不需要聲明了,這樣編譯連警告都沒有,如果你在main函數中定義函數,而函數定義的位置比函數調用還要後,那麽就無法通過編譯了。進一步做無聊事情,假設我們在函數調用語句之後再定義函數,這個條件下有兩種情況(單文件下),在main函數外面定義這個函數,編譯會出警告信息,但是可以通過。如果是在main函數裏面定義的。那就編譯就會有警告+錯誤信息。
同樣的關於函數聲明的位置也是可以無聊地摸索一下。因為函數聲明可以放在main函數外面,也可以放在main函數裏面。我說可以放在main函數外面肯定說的是放在main函數上面。這個是正常做法。有的書會把聲明放在main函數裏面,也是可以的。只要只要聲明函數的位置在函數調用前面就OK了。由此可以弱弱地推測出,C編譯器是看到了聲明,然後去尋找對應函數定義進行編譯。如果沒有聲明,但是函數定義寫在函數調用前面,那這個函數定義也比函數調用的代碼先一步編譯了也沒問題了。這個弱弱地推測,就可以解釋我以上無聊的實驗結果了。
當時除了我這樣無聊的初學者,誰會一直在main函數裏寫函數呢?
C語言函數聲明什麽時候可以省略,什麽時候不能省?