为什么人们在C++中使用`main()`而不是`int main()`?
在C中使用main()
而不是int main()
是可以的,但这是一个outdated practice。但是我看到人们在C++中使用main()
而不是int main()
。如果他们使用main()
,他们的意思是void main()
如this question?为什么人们在C++中使用`main()`而不是`int main()`?
当使用GCC的最新版本,这两种编译完全相同的输出:
int main(int argc, char* argv[]) { ... }
main(int argc, char* argv[]) { ...}
我因此得出结论:int
是隐含的。
你在谈论哪个'GCC'当前版本?无论如何,它不是5.x或6.x编译器。或者,也许你是指GCC的'g ++'编译器(而不是'gcc')。使用'g ++'并且没有选项,它可以在不用g ++'6.3.0; 'gcc' 6.3.0的相同代码不会在没有警告的情况下编译。 –
对不起,你是对的 - g ++,特别是:'g ++(Ubuntu 5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609' – Scovetta
我有点惊讶地发现它在G ++的默认选项下无警告地编译;我知道它不会在GCC下。它需要一个'-pedantic'或'-Wall'或类似的东西来引发来自'g ++'的警告 - 即使是'-std = C++ 11'或'-std = C++ 14'也是不够的。我想它仍然是可以允许的,因为它在实践中仍然很普遍,而且它在实践中部分流行,因为在默认选项下它仍然是允许的。尽管任何人正在编译没有“WALL”或更严格的选项是任何人的猜测。 –
有意思。我明白你的问题彼得。 但现在一天没有人使用main()声明而没有原型。 你问的问题是关于旧的c标准,但我们在c标准11.所以不要期望旧的main()声明。旧的c标准如果函数没有返回任何内容,那么他们用来假定返回一个整数。希望这可以解释你的问题。 如果你有更多的疑问,请参考 检查出链接 http://ee.hawaii.edu/~tep/EE160/Book/chapapx/node7.html 我认为它用来返回 所以用同样的方式,C++标准可能支持旧标准。
你现在找到最常见的声明是
INT主(INT ARGC,字符** argv的) 或 INT主() 或 无效的主要()
检出http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c – venky513
AFAIK,它是非标准的,并会导致编译错误,如果你的警告足够高。我会想象编译器支持它的原因是遗留的,例如C++与ANSI C兼容的事实,它在当时需要支持传统的C代码,它没有初始的'int',所以它可能级联到现代C++编译器。但这就是我的猜测,我可能是错的。 – Qix
如果它来自C,隐式返回类型将是'int',而不是'void',所以它比'void main'更正确。尽管如此,仍然很丑。自第一个ANSI C标准以来,隐式返回类型一直被忽视。 – ShadowRanger
即使在C语言中,现代C编译器只能在向后兼容模式下工作时接受'main()' - 而不是'int main()'。 GCC 5.x及更高版本默认为C11模式,其中'plain'main()不可接受,而GCC 4.x和更早版本默认为C90模式,在那里它是可以的。自90年代初期以来,它(简单的'main()')在'标准'(严格)C++中并没有确定。一些编译器可能仍然允许它(同样,出于向后兼容的原因),但它并不正确。因此,任何在现代代码中编写简单的'main()'的人都会犯这个错误。任何在旧代码中遇到简单的'main()'的人都应该更新它。 –