C/C++ 中 void main 和 int main 的区别? [复制]
Posted
技术标签:
【中文标题】C/C++ 中 void main 和 int main 的区别? [复制]【英文标题】:Difference between void main and int main in C/C++? [duplicate] 【发布时间】:2010-10-12 19:37:16 【问题描述】:在 C++(或 C)程序中声明 main
函数的方式有关系吗?
【问题讨论】:
【参考方案1】:不同的是,一个是main
的正确定义方式,另一个不是。
是的,这很重要。要么
int main(int argc, char** argv)
或
int main()
是根据 C++ 规范对 main
的正确定义。
void main(int argc, char** argv)
IIRC 过去和现在都不是旧版 Microsoft C++ 编译器带来的变态。
https://isocpp.org/wiki/faq/newbie#main-returns-int
【讨论】:
int main(void) 也合适 其实,虽然没关系,但我认为 int main() 优于 int main(void)【参考方案2】:Bjarne Stroustrup 说得很清楚:
void main()
的定义不是,也从来不是 C++,甚至也不是 C。
见reference。
【讨论】:
【参考方案3】:您应该使用int main
。 C 和 C++ 标准都规定 main
应该返回一个值。
【讨论】:
【参考方案4】:对于 C++,只允许使用 int。对于 C,C99 表示只允许使用 int。之前的标准允许 void
返回。
简而言之,总是int
。
【讨论】:
C89 也需要返回一个 int。【参考方案5】:关键是,C 程序(和 C++ 相同)总是(应该?)返回成功值或错误代码,所以它们应该这样声明。
【讨论】:
是吗?谁会在你的火星探测器裸机设备中使用该返回码? :) 这是一个有用的问题——作为一个禅宗公案。【参考方案6】:很久以前,我发现this page (void main(void)) 包含“标准说它无效”论点之外的许多原因。在特定的操作系统/架构上,它可能会导致堆栈损坏或发生其他令人讨厌的事情。
【讨论】:
【参考方案7】:如果您遵循规范,则应始终声明 main
返回 int
。
不过,实际上,大多数编译器都会让你摆脱其中任何一种,所以真正的区别在于你是否想要/需要向 shell 返回一个值。
【讨论】:
您应该始终尝试“按规范”做事,除非有令人信服的理由不这样做。当然,很多实现都允许 void main 和其他扩展。这并不意味着您应该依赖实现特定的扩展。在嵌入式应用程序中,没有外壳,void main 是可以的。 我将继续并同意所有这些。有一段时间,我养成了使用 void 与 int 的习惯,作为一种关于我是否期望返回值的伪注释,但现在我总是使用 int。 当正确的事情更多的工作时,为什么做错误的事情(在某些情况下会起作用)有价值? @Tom:因为......正确的事情是更多的工作?我不确定这句话是否正确解析。 @Ahoy - 我错过了一个关键词...意思是说“...当正确的事情是没有更多的工作”【参考方案8】:在 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[]) /* ... */
或同等学历; 或以其他一些实现定义的方式。
另请注意,gcc 确实会编译 void main()
,尽管实际上它会在遇到右大括号时编译 return 0;
。
【讨论】:
但是,gcc -pedantic
会拒绝它。不使用-pedantic
就是搞砸了。
如果您依赖实现定义的行为,那么您的程序不符合标准。您的编译器可能会接受它,但它不是有效的 C99,只是 foo-C99。
@Konrad Rudolph 嘿,如果我们没有使用gcc -pedantic
,这是否意味着我们没有使用标准C?其次,如果你告诉我它写在哪里,我将不胜感激。
@Jed 嘿,如果我们没有使用gcc -pedantic
,这是否意味着我们没有使用标准C?其次,如果你告诉我它写在哪里,我将不胜感激。
@NirajRaut 不,相反。我总是至少使用-pedantic
或-pedantic-errors
。绝对没有理由使用不正确的返回类型,这只是草率(但请注意,独立的 C 实现具有不同的入口点函数!)。以上是关于C/C++ 中 void main 和 int main 的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
void main(), int main() 和int main(void)的区别