2017-02-17 124 views
0

在C中使用main()而不是int main()是可以的,但這是一個outdated practice。但是我看到人們在C++中使用main()而不是int main()。如果他們使用main(),他們的意思是void main()this question爲什麼人們在C++中使用`main()`而不是`int main()`?

+2

AFAIK,它是非標準的,並會導致編譯錯誤,如果你的警告足夠高。我會想象編譯器支持它的原因是遺留的,例如C++與ANSI C兼容的事實,它在當時需要支持傳統的C代碼,它沒有初始的'int',所以它可能級聯到現代C++編譯器。但這就是我的猜測,我可能是錯的。 – Qix

+1

如果它來自C,隱式返回類型將是'int',而不是'void',所以它比'void main'更正確。儘管如此,仍然很醜。自第一個ANSI C標準以來,隱式返回類型一直被忽視。 – ShadowRanger

+0

即使在C語言中,現代C編譯器只能在向後兼容模式下工作時接受'main()' - 而不是'int main()'。 GCC 5.x及更高版本默認爲C11模式,其中'plain'main()不可接受,而GCC 4.x和更早版本默認爲C90模式,在那裏它是可以的。自90年代初期以來,它(簡單的'main()')在'標準'(嚴格)C++中並沒有確定。一些編譯器可能仍然允許它(同樣,出於向後兼容的原因),但它並不正確。因此,任何在現代代碼中編寫簡單的'main()'的人都會犯這個錯誤。任何在舊代碼中遇到簡單的'main()'的人都應該更新它。 –

回答

0

當使用GCC的最新版本,這兩種編譯完全相同的輸出:

int main(int argc, char* argv[]) { ... } 

main(int argc, char* argv[]) { ...} 

我因此得出結論:int是隱含的。

+0

你在談論哪個'GCC'當前版本?無論如何,它不是5.x或6.x編譯器。或者,也許你是指GCC的'g ++'編譯器(而不是'gcc')。使用'g ++'並且沒有選項,它可以在不用g ++'6.3.0; 'gcc' 6.3.0的相同代碼不會在沒有警告的情況下編譯。 –

+0

對不起,你是對的 - g ++,特別是:'g ++(Ubuntu 5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609' – Scovetta

+0

我有點驚訝地發現它在G ++的默認選項下無警告地編譯;我知道它不會在GCC下。它需要一個'-pedantic'或'-Wall'或類似的東西來引發來自'g ++'的警告 - 即使是'-std = C++ 11'或'-std = C++ 14'也是不夠的。我想它仍然是可以允許的,因爲它在實踐中仍然很普遍,而且它在實踐中部分流行,因爲在默認選項下它仍然是允許的。儘管任何人正在編譯沒有「WALL」或更嚴格的選項是任何人的猜測。 –

0

有意思。我明白你的問題彼得。 但現在一天沒有人使用main()聲明而沒有原型。 你問的問題是關於舊的c標準,但我們在c標準11.所以不要期望舊的main()聲明。舊的c標準如果函數沒有返回任何內容,那麼他​​們用來假定返回一個整數。希望這可以解釋你的問題。 如果你有更多的疑問,請參考 檢查出鏈接 http://ee.hawaii.edu/~tep/EE160/Book/chapapx/node7.html 我認爲它用來返回 所以用同樣的方式,C++標準可能支持舊標準。

你現在找到最常見的聲明是
INT主(INT ARGC,字符** argv的) 或 INT主() 或 無效的主要()

+0

檢出http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c – venky513

相關問題