main
我在 C++(或 C)程序中声明函数的方式有关系吗?
8 回答
区别在于一个是正确的定义方式main
,另一个不是。
是的,这很重要。任何一个
int main(int argc, char** argv)
或者
int main()
是您main
根据 C++ 规范的正确定义。
void main(int argc, char** argv)
IIRC 不是并且曾经是旧 Microsoft 的 C++ 编译器附带的一种变态。
你应该使用int main
. C 和 C++ 标准都指定main
应该返回一个值。
对于 C++,只允许使用 int。对于 C,C99 表示只允许 int。先前的标准允许void
退货。
简而言之,总是int
。
关键是,C 程序(和 C++ 相同)总是(应该?)返回成功值或错误代码,因此应该以这种方式声明它们。
很久以前,我发现这个页面 (void main(void))包含“标准说它无效”论点之外的许多原因。在特定的操作系统/架构上,它可能会导致堆栈损坏或发生其他令人讨厌的事情。
如果您按照规范进行,那么您应该始终声明main
返回一个int
.
但实际上,大多数编译器都会让你摆脱其中任何一个,所以真正的区别在于你是否想要/需要向 shell 返回一个值。
在 C++ 中,main()
必须返回int
. 但是,C99 允许main()
具有非int
返回类型。这是 C99 标准的摘录。
5.1.2.2.1 程序启动
程序启动时调用的函数名为 main。实现没有声明这个函数的原型。它应定义为返回类型为 int 且不带参数:
int main(void) { /* ... */ }
或者带有两个参数(这里称为 argc 和 argv,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 或以其他一些实现定义的方式。
另请注意,void main()
尽管实际上 gcc 确实会编译,但它会return 0;
在遇到右大括号时进行编译。