按惯例返回零是什么意思?

时间:2010-03-03 12:05:38

标签: c++

这可能是一个愚蠢的问题,但我总是发现自己想知道哪个是标准。

在大多数(不是说全部)C ++第一个例子中,您可能会看到main函数返回0值。这意味着操作是否正常?

  • 0 - >好的
  • 1 - >不行
  • 其他 - > ?

这是标准的做法吗?

顺便说一下,在这种情况下返回整数或布尔值会更好吗?

谢谢你们!

7 个答案:

答案 0 :(得分:6)

0EXIT_SUCCESS表示成功。 EXIT_FAILURE表示失败。任何其他值都是实现定义的,并不保证支持。特别是,std::exit(1)return 1;实际上并不能保证表示失败,尽管在大多数常见系统中都会出现失败。

EXIT_SUCCESSEXIT_FAILURE<cstdlib>中定义。

编辑:我认为提供系统特定的示例可能很有用:

GNU make实用程序返回操作系统的退出状态:

  • 0:如果make成功,则退出状态为零。
  • 2:如果make遇到任何错误,则退出状态为2。它将打印描述特定错误的消息。
  • 1:如果使用`-q'标志并且make确定某些目标尚未更新,退出状态为1。

设置多个不同的失败值意味着您可以准确指定程序失败的方式。但有两点需要注意:

  • 没有关于失败状态代码的约定,afaik
  • 这适用于“普通”操作系统(windows,os x,unix),但C ++标准无法保证;因此,如果您尝试移植到VMS或某些嵌入式系统,它可能无法正常工作。

答案 1 :(得分:2)

0没关系,其他值是错误代码。主函数应根据标准返回int而不返回任何其他内容。之前在What should main() return in C and C++?

讨论了这个问题

答案 2 :(得分:0)

在C早期,没有例外概念。所以程序员通过使用错误代码帮助自己,并将0定义为无错误。所有其他错误代码都有自己的含义,由程序员定义。

这个方案被接管到C ++。但是现在你也有了在错误上抛出异常的概念(这是一种更好的OOP风格)。那个主要仍然使用int作为返回值有历史原因。

答案 3 :(得分:0)

这不是一个规则,而是更多的设计决策(但是,如果我没记错的话,像POSIX这样的标准有其定义)

0作为返回值被视为“正常”或“确定”。当您返回other than 0内容时,可以为OK或错误。例如,如果您发出read()调用,它可能会返回读取的正字节数 - 这肯定不是错误。但是,如果它返回0,则意味着文件结束。任何负值都会意味着阅读时会出现一些错误。

答案 4 :(得分:0)

  1. 零的含义。这实际上取决于类/功能设计。它应该是文档的一部分,客户端必须如何处理返回值。例如, COM 方法返回以指示成功操作(S_OK常量等于零)。如果操作成功,Windows文件操作(CreateFile等)将返回非零。你看,这取决于。可能涉及的唯一约定是:必须记录代码!!!
  2. 返回什么更好。我认为,int可能更适合更复杂的功能(您可能需要分析潜在的错误)。由于intbool通常在 EAX 寄存器中返回(假设您使用 x86 架构),因此无需额外内存即可返回一个int而不是bool

答案 5 :(得分:0)

最初返回值与错误代码相对应。想象一下,程序可能存在的所有可能错误结果的大表。该计划终止;你想知道什么,如果有的话,出错。如果返回非零整数,则在错误代码表中查找。如果返回0,则相当于“没有出错。”

我只是这样说,因为有时人们发现0不直观,0意味着好事。这有点像玻璃完全是空的......毒药。

答案 6 :(得分:0)

这是C / Unix遗产的残余。

如果在脚本中调用您的程序,则脚本可以了解您的程序是否成功。因此,诞生了从可执行程序返回0成功的惯例。

C没有本机布尔类型,所以这是一个整数。这使我们能够针对不同类型的错误返回不同的数字。

然后,这个约定传播到常规函数,因为正如其他人发布的那样,C / C ++最初没有异常,甚至一旦我们有异常,它就需要纪律才能正确使用它们,并且有很多遗留代码(和传统程序员)使用返回值约定。

如果您感兴趣的是成功/失败,那么0表示失败,1表示成功。对于内部返回值,即使目前只有两个值,我建议使用enum类型,因为双态有一种演变为三态的方式,并且更容易理解你的'做的。