2实现不应预先定义主函数。此函数不应超载
返回类型为 int 类型,但其类型是实现定义的。
所有实施方案
容许下列两种主要定义同时存在:
int main() { /* ... */ }
还有
int main(int argc, char* argv[]) { /* ... */ }
C + + 标准明确表示“ It [ The main function ]应该具有 int类型的返回类型,但除此之外它的类型是实现定义的”,并且需要与 C 标准相同的两个签名。因此,“ void main ()”直接不被 C + + 标准所允许,尽管它无法阻止不符合标准的实现允许替代品(也无法阻止符合标准的实现允许替代品作为标准的扩展)。
C + + 03、 C + + 11、 C + + 14和 C + + 17标准基本上与 C + + 98相同。
共同延伸
传统上,Unix 系统支持第三种变体:
int main(int argc, char **argv, char **envp) { ... }
我不清楚当一个具有 void main()的程序退出时会发生什么(退出代码返回给父代码或 o/s)ーー而且 MS 网站也是静默的。
有趣的是,MS 并没有规定 C 和 C + + 标准所要求的 main()的双参数版本。它只规定了一个三参数形式,其中第三个参数是 char **envp,一个指向环境变量列表的指针。
Microsoft 页面还列出了其他一些选项ーー使用宽字符字符串的 wmain()等等。
MicrosoftVS2005版本的 这一页没有列出 void main()作为替代。从 Microsoft VS 2008开始的 版本可以。
int main()和 int main(void)是一样的吗?
有关详细分析,请参阅我对 main()在 C 和 C + + 中应该返回什么的回答的结尾。(好像我曾经认为这个问题指的是 C + + ,尽管它并没有也从来没有。在 C + + 中,int main()和 int main(void)没有区别,int main()是习语 C + + 。)
在 C 语言中,这两种表示法之间存在差异,但是只有在深奥的情况下才会注意到这一点。具体来说,如果您从自己的代码调用 main()函数,那么这两者之间是有区别的,您可以在 C 语言中调用 main()函数,但是在 C + + 中不允许这样做。
int main()表示法并不提供 main()的原型,但是只有递归地调用它时才有意义。对于 int main(),你可以稍后(在同一个函数中,或者在另一个函数中)编写 int rc = main("absolute", "twaddle", 2):,正式地说,编译器不应该抱怨到拒绝编译代码的程度,尽管它可能会合法地抱怨(警告你)(并且在 GCC 中使用 -Werror会将这个警告转换成一个错误)。如果使用 int main(void),随后对 main()的调用应该会生成一个错误ーー您说函数不接受参数,但试图提供三个参数。当然,在声明或定义 main()之前,您不能合法地调用它(除非您仍然使用 C90语义)ーー而且实现没有声明 main()的原型。注意: C11标准在不同的示例中说明了 int main()和 int main(void)ーー它们在 C 中都是有效的,尽管它们之间存在细微的差别。