【问题标题】:What the reasons for/against returning 0 from main in ISO C++?在 ISO C++ 中/反对从 main 返回 0 的原因是什么?
【发布时间】:2011-02-04 15:16:12
【问题描述】:

我知道 C++ 标准规定如果没有给出 return 语句,则将 return 0 插入到 main() 的末尾;但是,我经常看到最近编写的符合标准的 C++ 代码在 main() 的末尾显式返回 0。如果编译器自动完成,出于什么原因有人想要显式返回 0?

【问题讨论】:

  • 哦,main() 的奥秘。肯定是因为一个优秀的程序员不会假定这条规则会迫使他将 main() 与他编写的 99.99% 的其他代码区别对待。她包括在内。
  • 嗯,从来没有这样想过。我想这有点类似于在 C 中去掉函数返回类型。我一直认为这有点阴暗。
  • 原则上我不写return 0;,除非非零是一个有效的返回值。这让我觉得自己像个叛逆者。
  • 所以,公认的答案是“看起来很奇怪”?这几乎证明了这是一个完全主观的问题。
  • @gnovice 你是说看起来不奇怪吗?

标签: c++


【解决方案1】:

通过明确表示您明确表明您的意图。

依靠隐含的东西,你可能有两种情况:1)你故意的,2)你忘记了。

【讨论】:

  • 但是这两种情况中的哪一种很重要? “没有区别的区别就是没有区别。”
  • @gnovice:因为如果你有 #2 “你忘记了”,那么你可能会在那里放一个返回值 1。
  • 值为1一般表示错误或异常终止。 OP专门询问return 0与否return 0(即成功返回)。忘记处理错误完全是一个单独的问题。如果我看到没有明确 return 0 的代码,我不会立即认为“他们完全忘记了错误”。
  • @gnovice:正是我的观点。值 1 通常表示错误。无论如何,我不想争论,所以请随意投反对票。
【解决方案2】:

因为不从具有非 void 返回类型的函数中“返回”某些东西看起来很奇怪(即使标准说这不是绝对必要的)。

【讨论】:

  • 我不是 100% 确定,但我记得标准说这是绝对必要的。
  • @Sergio:如果在没有返回语句的情况下到达非 void 函数的末尾,则会导致未定义的行为。但是,main 会隐含地return 0;。
【解决方案3】:
  • 让其他程序员清楚,您并没有忘记将 return 语句放在那里。

  • 如果您不返回任何内容,某些编译器可能会发出警告。

  • 明确显示函数返回的内容。

  • 很多程序员不知道这条规则。

【讨论】:

  • "如果您不返回任何内容,某些编译器可能会发出警告。"编译器是错误的,在这种情况下你是正确的:)
  • 如果你是对的而编译器是错的,这真的很重要吗?在大多数情况下,即使您“技术上”正确,编译器警告也是不可接受的。特别是因为编译器警告很好地表明编译器不符合隐式返回 0。
  • 我不会说太多。它可能发生,当然,我们都见过。但我愿意打赌大多数警告是在代码实际错误的情况下发出的。
  • @GMan:我没有说大多数编译器警告 /are/ 是在正确的代码上发出的​​。我说过大多数警告/可以/在正确的代码上发出。但是,对于每个警告,它可能只发生在一小部分情况下。
【解决方案4】:

误会。根本没有理由,如果有人不知道他们会添加return 0;。

【讨论】:

    【解决方案5】:

    仅仅因为您的代码符合标准,谁说您的代码将通过兼容的编译器运行?信不信由你,除了最新版本的 GCC 和 Visual C++,人们确实使用编译器。

    当然还有其他人都提到的明确意图。

    【讨论】:

    • 你知道没有它会窒息的编译器吗?
    • 不,但我也没有测试今天使用的每个编译器。
    • 嗯,如果编译器卡住了,可能是时候放弃编译器了。
    • 还不错,但某些领域的一些人(想到军事和汽车)并没有奢侈地随时更新他们的工具。
    • 你不能总是放弃编译器——你可能需要一个用于旧平台或嵌入式平台的特定编译器。
    【解决方案6】:

    它使代码的行为明确。

    【讨论】:

      【解决方案7】:

      因为有些人不知道。不一定是编写该代码的人(尽管这也是可能的),但有些人在那里。明确写return 0; 对他们很好。

      此外,作为一种惯例,它使语言更加统一,这在美学上至少对我来说很重要。

      【讨论】:

        【解决方案8】:

        因为这就是他们 30 年前的做法。这更像是 IMO 的惯例。

        【讨论】:

        • @Juan 我个人不会在main的末尾写return 0,我只是在回答为什么我们看到它虽然没有必要的问题。
        • 我知道,我所说的只是因为他们 30 年前就是这样做的而做某事是不这样做的更多理由。
        【解决方案9】:

        我经常这样做是因为我经常为直接 C 编译代码,所以我要么出于习惯而输入它,要么因为我创建的 main() 的 sn-p 具有显式返回。没有理由删除它,所以它通常会保留。

        再一次,有时我不会费心输入它(也许我意识到我不需要它)或者我可能使用了不同的 sn-p。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-25
          • 2011-06-18
          • 2016-10-16
          • 1970-01-01
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 2021-01-07
          相关资源
          最近更新 更多