2012-02-25 45 views
16

爲什麼在C++中將入口點的返回類型設置爲void一直不鼓勵,後來被標準去除,現代編譯器禁止?爲什麼它被認爲是不好的做法?什麼是錯誤的void main()?

現在,據我瞭解C#和Java都允許的入口點的返回類型爲void

static void main(String[] args) /* Java */ 
static void Main(string[] args) /* C# */ 

和C#和Java程序員不認爲這是不好的做法,他們實際上經常使用它。

這些

其它語種(僅是,我懷疑C++會成功在這十年中,至少)C的可能接班人++像d編程語言或瓦拉還允許void main()。正如你所看到的,我懷疑C++社區是否將它從標準中刪除了,因爲它太模糊或者不受歡迎。

所以我的問題是,爲什麼C++社區刪除void main()?它有什麼問題?

+1

不同的語言設計師做出不同的決定。爲什麼這有關係? – 2012-02-25 07:20:59

+0

@GregHewgill我明白這一點。但是C++設計師做出決定的因素和原因是什麼? – ApprenticeHacker 2012-02-25 07:23:34

+1

直接從馬的嘴:http://www2.research.att.com/~bs/bs_faq2.html#void-main :) – 2012-02-25 07:35:41

回答

10

C++標準委員會可能選擇要求int main(),因爲現有的大量代碼預計會使用return語句將特定的退出代碼返回到運行時系統。期望所有現有代碼改爲使用exit()代替,這是不合理的,因此int main()是標準中的一項要求。

Java等語言在設計時沒有任何現有代碼需要保持兼容。因此,設計人員可以選擇void main()並要求使用System.exit()作爲非零退出代碼。

因此,對於C++標準選擇void main()會是「錯誤的」,它會破壞預期使用return的現有代碼和main()的退出代碼值。

+1

我明白了。所以他們選擇'int main()'來兼容現有的代碼。大聲笑,我應該知道...:D – ApprenticeHacker 2012-02-25 07:33:21

+2

我沒有參加早期的C++標準會議,但我懷疑委員會真的選擇了什麼:從一開始就使用返回值是C++的一部分,因爲它意味着基本上也是C的擴展.C基本上也被用來具有'int'返回(雖然通常隱含地聲明:你可以最初放棄'int',編譯器會假設這是你的意思)有一個方法自動判斷程序是否成功。如果一個程序的結果是「無效的」,這並不表示它是否成功。 – 2012-02-25 07:52:48

8

您通常想知道程序的退出狀態。這就是你有int main()的原因 - 你返回退出狀態。

3

這是錯誤的,因爲這不是C++標準指定的合法main。沒有人關心其他語言指定的內容。對於C++程序,只有C++標準是相關的,它說int

+2

換句話說,這個問題是爲什麼這麼說? – 2012-02-25 07:24:27

+0

@Soufiane:這個問題問爲什麼它是無效的# – Puppy 2012-02-25 07:42:56

+1

_這是錯誤的,因爲這不是什麼C++標準指定_ ... _只有C++標準是相關的_。大聲笑,從這我收集, 'C++標準==最新的神聖遺囑' – ApprenticeHacker 2012-02-25 07:49:11

10

C++有從來沒有允許void main(),雖然有些編譯器可能允許它作爲擴展或只是因爲他們不診斷它。

類似地C從來沒有允許void main()以外的其他擴展名;引入void關鍵字的1989年相同標準定義了main的兩個標準定義:int main(void)int main(int argc, char *argv[])

其他語言允許它,因爲它們是其他語言。

能夠編寫void main()而不是int main()沒有特別的優勢。你甚至不需要顯式地返回一個值; main的末尾相當於return 0;(在C++中,在C中以C99開頭)。

+0

+1。然而,雖然它從未被允許,但即使Bjarne Stroustrup自己也寫過「void main」,即在「C++編程語言」的第二版(也可能在第一版中,我沒有檢查過)。這只是一個模糊的東西,就像許多其他任意的常規慣例一樣。 – 2012-02-25 07:45:50

+0

@ Cheersandhth.-Alf:我剛剛檢查了TC++ PL的第二版(我認爲是第9版),並沒有看到任何對'void main()'的引用 - 儘管至少有一次'main()'帶有一個隱式的'int'返回類型(語言不再允許這樣做)。我檢查了索引中對'main'的所有引用。是在我有的版本中糾正過的,還是我錯過了什麼? – 2012-09-28 09:09:25

+1

那麼,就像你現在一樣,Bjarne對2006年早些時候他做了這樣的事情有些懷疑。 [http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be](http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be),我在哪裏回答「我現在在第233頁第7.3.2節末尾找到的第一個例子」。我現在沒有這本書,但我認爲我自己的參考是正確的。 :-) – 2012-09-28 10:14:36

相關問題