不要讓main函式返回void

2021-08-20 19:21:49 字數 2921 閱讀 3019

同c程式一樣,每個c++程式都包含乙個或多個函式,而且必須有乙個函式命名為main,並且每個函式都由具有一定功能的語句序列組成。作業系統將main作為程式入口,呼叫main函式來執行程式;main函式執行其語句序列,並返回乙個值給作業系統。在大多數系統中,main函式的返回值用於說明程式的退出狀態。如果返回0,則代表main函式成功執行完畢,程式正常退出,否則代表程式異常退出。

然而在編寫c++程式入口函式main的時候,很多程式設計師,特別是一些具有c基礎的c++程式設計師時經常會寫出如下格式的main函式:

void main()

上述**在vc++中是可以正確編譯、鏈結、執行的。編譯資訊如下所示:

1>------ 已啟動生成: 專案: maincpp, 配置: debug win32 ------

1>  main.cpp

1>  maincpp.vcxproj -> g:\maincpp\debug\maincpp.exe

********** 生成: 成功1 個,失敗 0  個,最新 0  個,跳過 0  個**********

但是當你將**放在linux環境下,採用gcc編譯器進行編譯時,你會吃驚地發現編譯器丟擲了如下的錯誤資訊:

[develop@localhost ~]  g++ main.cpp

main.cpp:2: 錯誤 :'::main' 必須返回'int'

為什麼同樣的**會出現兩種不同的結果呢?這還是跨平台的c/c++語言嗎?不要對c/c++的跨平台性產生質疑,之所以會這樣,很大程度上要歸結於市面上一些書的「誤導」,以及微軟對vc++編譯器main返回值問題的過分縱容。

在c和c++中,不接收任何引數也不返回任何資訊的函式原型為「voidf(void);」。所以很多人認為,不需要程式返回值時可以把main函式定義成voidmain(void),然而這種想法是非常錯誤的!

有一點你必須明確:在c/c++標準中從來沒有定義過voidmain()這樣的**形式。c++之父bjarnestroustrup在他的主頁faq中明確地寫著這樣一句話:

在c++中絕對沒有出現過voidmain()這樣的函式定義,在c語言中也是。main函式的返回值應該定義為int型別,在c和c++標準中都是這樣規定的。在c99標準中規定,只有以下兩種定義方式是正確的:

int main( void )

int main( int argc, char *argv )

在c++03中也給出了如下兩種main函式的定義方式:

int main()

int main( int argc, char *argv )

雖然在c和c++標準中並不支援voidmain(),但在部分編譯器中voidmain()依舊是可以通過編譯並執行的,比如微軟的vc++。由於微軟產品的市場占有率與影響力很大,因此在某種程度上加劇了這種不良習慣的蔓延。不過,並非所有的編譯器都支援voidmain(),gcc就站在了vc++的對立面,它是這一不良習氣的堅定抵制者,它會在編譯時就明確地給出乙個錯誤。

如果你堅持在某些編譯器中使用voidmain()這種非標準形式的**,那麼當你把程式從乙個編譯器移植到另乙個編譯器時,你就要對可能出現的錯誤負責。

除了有voidmain()這樣的不規範格式外,在c語言程式中,尤其是一些老版本的c**中,你還會經常看到main()這樣的**形式。

一些老的c標準(諸如c90)是支援main()這樣的形式的。之所以支援,是因為在第一版的c語言中只有int一種資料型別,並不存在char、long、float、double等這些內建資料型別。既然只有int一種型別,也就不必顯式地為main函式標明返回型別了。在brian w.kernighan和dennis m.ritchie的經典巨著《the c programming language,second edition》中用的就是main()。後來,在c語言的改進版中資料型別得到了擴充,為了能相容以前的**,標準委員會就做出了如下規定:不明確標明返回值的,預設返回值為int。在c99標準中,則要求編譯器對於main()這種用法至少要丟擲乙個警告。

main函式返回值的作用,可以採用下面的方法加以驗證。

首先,編寫main.cpp檔案,檔案內容如下所示:

int main()

在linux環境下,採用命令:

g++ main.cpp

生成可執行檔案a.out。然後,執行命令:

./a.out && ehco "success"

結果輸出success。

修改上述程式:

int main()

做同樣測試,無輸出。

命令a&&b中的&&類似於c++中的並操作(&&),如果a命令正確執行,接著就會執行命令b;如果a出現異常,則b不執行。通過以上分析可知,當main()返回0時,a.out正確執行並返回;但是如果返回-1,程式就不能正常返回了。

最後,還得說明一下c++標準中乙個「好壞難定」的規定:

在main函式中,return語句的作用在於離開main函式(析構掉所有具有動態生存時間的物件),並將其返回值作為引數來呼叫exit函式。如果函式執行到結尾而沒有遇到return語句,其效果等同於執行了return0。

也就是說,如果函式執行到main結束處時沒有遇到return語句,編譯器會隱式地為你加上return0;,效果與返回0相同。之所以說這條規定「好壞難定」,一方面是因為它讓你省去了多敲幾個字的麻煩;另一方面是因為這種便捷會讓某些程式設計師忽視編譯器代替他做的工作,而在思維中形成一種錯誤的認識:此函式可以無返回。

在應用這一規則時,你還得注意以下這兩點:

main函式的返回型別是int,不是void或其他型別。

該規則僅僅對main函式適用。

按照以上標準得到了乙個完全合乎c/c++標準的最小化的完整c++程式:

int main() 

本人不推薦使用上述這條規則,建議加上return0;,杜絕那些不必要誤解。

請記住:

要想保證程式具有良好的可移植性能,就要標明main函式返回int,而不是void。強烈建議使用以下形式:

int main()

main函式返回整型值原因

自 http www.eefocus.com article 09 10 85481s.html linux c程式設計一站式學習 main函式最標準的原型應該是int main int argc,char argv 也就是說啟動例程會傳兩個引數給main函式,這兩個引數的含義我們學了指標以後再解釋...

main函式的返回值

最近在面試過程中,面試官都會問些c語言容易忽視的地方,如main函式返回值的作用等。這些細節還是得學習下,雖然在實踐工作中的使用會較少。程式執行過程入口點main函式,main 函式返回值型別必須是int,這樣返回值才能傳遞給程式啟用者 如作業系統 表示程式正常退出。main int args,ch...

檢視main函式的返回值

1 printf args 等價於 fprintf stdout,args 2 main 函式的返回值是乙個狀態指示器,返回值是0表示main 函式成功執行完畢 3 訪問main 函式的返回值的方式和系統有關,不論是unix還是windows系統,執行程式後,必須發出乙個適當的echo命令。unix...