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 的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中void main和int main有啥区别

void main(), int main() 和int main(void)的区别

c ++将void *转换为int错误

int main() 和 int main(void) 之间的区别?

C语言迷惑行为大赏

C--int main 和void main的区别