main() 在 C++ 中应该返回什么?与 C 语言及标准的比较

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:即使是专家也会问的核心问题



您是否曾想过,为什么每个 C++ 程序都以 int main() 开头,而不是 void main()?当您写下 return 0 时,实际发生了什么?这个问题在 Stack Overflow 上非常热门,获得了数千次浏览和数百条评论。看似一个基础话题,却隐藏着一系列细微差别,这些差别区分了 C 和 C++,也区分了新手和经验丰富的开发者。



在本文中,我们不仅会给出一个干巴巴的答案。我们将进行 C 和 C++ 方法的对比,分析标准,展示真实的代码示例,并讲解如何正确处理 main() 的返回值,使您的代码不仅能够运行,而且具有可移植性。无论您是在学习 C++ 还是每天都在使用它,本文都适合您。



简短回答:C++ 中的 main() 应该返回什么?



如果您赶时间,核心要点如下:C++ 中的 main() 函数必须返回 int。这是标准的严格要求(从 C++98 到 C++23)。返回值向操作系统报告程序是否成功完成。



以下是最小正确代码:



#include <iostream>

int main() { std::cout << "Hello, World!" << std::endl; return 0; // 成功完成}


但这只是冰山一角。让我们深入探讨。



为什么是 int 而不是 void?历史背景



在最早的 C 语言版本中(在 ANSI C 标准之前),main() 的类型并未严格定义。许多编译器允许编写 void main(),并且它确实能工作。然而,随着标准化(C 语言的 C89/C90 和 C++ 的 C++98)的到来,决定 main() 必须向操作系统返回一个退出码。



为什么?因为脚本、Makefile 和其他程序经常检查您的进程是如何结束的。返回码 0 表示“成功”,任何非零值表示“错误”(或特定类型的错误)。如果 main() 是 void 类型,您将无法传递此信息。



在 C++ 中,情况更为严格。C++ 标准(章节 [basic.start.main])明确指出:main() 必须具有 int 类型。任何其他声明(例如 void main())都是编译器扩展,会使代码不可移植。



C 和 C++ 的对比:有什么区别?



尽管两种语言都要求 int main(),但有几个关键区别:



  • C++ 中的隐式 return 0:如果您在 main() 末尾没有写 return,C++ 会自动插入 return 0。在 C 语言中(从 C99 开始)也是如此,但在旧标准(C89)中,缺少 return 会导致未定义行为。
  • 命令行参数:在 C++ 中,您可以声明 int main(int argc, char* argv[]) 或 int main()。在 C 语言中,还有带环境变量的第三种形式(char* envp[]),但在 C++ 中并未标准化(尽管许多编译器支持)。
  • void main():在 C 语言中,某些编译器(例如用于嵌入式系统的编译器)可能允许 void main()。在 C++ 中,这是一个严重错误,并且在严格模式下代码将无法编译。


C++ 示例(始终有效):



int main() {    std::cout << "C++ 会自动返回 0" << std::endl;    // return 0; // 可以不写}


C 语言示例(在旧标准中需要显式 return):



#include <stdio.h>

int main() { printf("在 C89 中需要显式返回 0"); return 0; // 必须}


返回码是什么意思?通过示例分析



返回码是

博客

书籍推荐