我应该从 main() 返回 EXIT_SUCCESS 还是 0?

新手上路,请多包涵

这是一个简单的问题,但我一直看到相互矛盾的答案:C++ 程序的主例程应该返回 0 还是 EXIT_SUCCESS

 #include <cstdlib>
int main(){return EXIT_SUCCESS;}

或者

int main(){return 0;}

它们是完全一样的吗? EXIT_SUCCESS 应该只与 exit() 一起使用吗?

我认为 EXIT_SUCCESS 会是更好的选择,因为其他软件可能希望将零视为失败,但我还听说如果您返回 0 ,编译器能够将其更改为反正价值不一样。

原文由 Trevor Hickey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 873
2 个回答

EXIT_FAILURE ,无论是在 --- 的 return 语句中,还是作为 — exit() main 的参数,都是在 C 或 C++ 程序中指示失败的唯一可移植方式。例如, exit(1) 实际上可以在 VMS 上发出成功终止的信号。

如果您要在程序失败时使用 EXIT_FAILURE ,那么您最好在程序成功时使用 EXIT_SUCCESS ,只是为了对称。

另一方面,如果程序从不发出失败信号,您可以使用 0EXIT_SUCCESS 。标准保证两者都表示成功完成。 (几乎不可能 EXIT_SUCCESS 的值不是 0,但在我听说过的每个实现中它都等于 0。)

Using 0 has the minor advantage that you don’t need #include <stdlib.h> in C, or #include <cstdlib> in C++ (if you’re using a return 声明而不是调用 exit() ) -- 但是对于任何重要规模的程序,无论如何您都将直接或间接地包含 stdlib。

就此而言,在从 1999 年标准开始的 C 和所有版本的 C++ 中,到达 main() 的结尾会隐含 return 0; 无论如何,所以你可能不需要使用任何一个 0EXIT_SUCCESS 明确。 (但至少在 C 语言中,我认为明确的 return 0; 是更好的风格。)

(有人问过 OpenVMS。我很久没有使用它了,但我记得奇数状态值通常表示成功,而偶数值表示失败。C 实现映射 01 ,所以 return 0; 表示成功终止。其他值不变传递,所以 return 1; 也表示成功终止 EXIT_FAILURE 将具有非零偶数值.)

原文由 Keith Thompson 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是一个永无止境的故事,反映了“互操作性和可移植性”的局限性(一个神话)。

程序应该返回什么来表示“成功”应该由接收值的人(操作系统或调用程序的进程)定义,而不是由语言规范定义。

但是程序员喜欢以“可移植方式”编写代码,因此他们为定义要返回的符号值的“操作系统”概念发明了自己的模型。

现在,在多对多场景中(许多语言用于向许多系统编写程序),“成功”的语言约定和操作系统之间的对应关系(没有人可以允许始终相同)应该由特定目标平台的库的特定实现来处理。

但是 - 不幸的是 - 这些概念在部署 C 语言时并不那么清楚(主要是为了编写 UNIX 内核),以及写成“返回 0 意味着成功”的书的千兆克,因为这在操作系统上是正确的那个时候有一个 C 编译器。

从那时起,对于如何处理此类通信,就再也没有明确的标准。 C 和 C++ 对“返回值”有自己的定义,但没有人授予正确的操作系统翻译(或者更好的是:没有编译器文档对此有任何说明)。 0 表示成功,如果对于 UNIX - LINUX 和 - 出于独立原因 - 对于 Windows 也是如此,这涵盖了 90% 的现有“消费者计算机”,在大多数情况下 - 忽略返回值(所以我们可以讨论了几十年,但没有人会注意到!)

在这种情况下,在做出决定之前,请问以下问题: - 我是否有兴趣与我的来电者交流我现有的信息? (如果我总是返回 0 ……所有事情背后都没有任何线索) - 我的来电者是否有关于这种沟通的约定? (请注意,单个值不是约定:不允许任何信息表示)

如果这两个答案都不是,那么好的解决方案可能是根本不编写主要的 return 语句。 (并让编译器来决定,相对于目标是如何工作的)。

如果没有约定,则 0=成功满足大多数情况(如果符号引入约定,则使用符号可能会有问题)。

如果约定到位,请确保使用与其一致的符号常量(并确保平台之间的约定一致,而不是价值一致)。

原文由 Emilio Garavaglia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题