【问题标题】:Convention result and code error C++ int foo (...)约定结果和代码错误 C++ int foo (...)
【发布时间】:2009-12-10 16:08:50
【问题描述】:

例如,在 Linux 中,当我使用批处理时,如果错误代码为 0,那很好,但 C++ 中的约定是什么?

当 int(或 bool)等于 1 时,我们说这是真的,但是在 C++ 中这样的函数的返回值是什么?

【问题讨论】:

    标签: c++ rules boolean


    【解决方案1】:

    在 C++ 中,通常使用 boolean return 来表示 true 表示成功,false 表示失败。

    使用整数返回值也很常见,其中零表示成功,非零表示失败或任何其他情况(通常负数表示错误,而正数表示其他结果)。

    无论您选择哪种方法,重要的是对其进行记录并在整个代码库中保持一致。

    【讨论】:

    • 还有另一种约定,其中零为假,非零为真。
    【解决方案2】:

    在 C 及其运行时库中,0 表示成功(有时需要轮询 errno)。

    在 C++ 世界里更加丰富多彩:

    • 成功/失败的布尔值
    • 如果有更多状态则枚举
    • 例外情况......以及例外情况和对象构造/破坏;有时它们不可用或不允许(主要是嵌入式平台,有时是游戏以最大限度地提高性能)

    不要混合使用 bool 使用约定和“0”,结果只是简单的混淆代码(参见示例)。如果您碰巧需要多个值,请根据情况使用枚举、附加返回参数或异常。

    引入了 bool 和 '0' 代码混淆:

    // sorry for abuse of "C" for educational purposes
    bool isSame(s1,s2) { return s1==s2; }
    int isSame2(s1, s2) { return strcmp(s1.cstr(), s2.cstr()); } 
    
    if (isSame(..) && !isSame2(..)) ...
    

    【讨论】:

      【解决方案3】:

      C++ 函数或方法可以返回 bool 值,例如 truefalse。程序(即main 函数)必须返回一个int 值,例如0 以报告“成功”。

      【讨论】:

      • 好的,所以 main 的结果与 shell 的行为相同 :-) 谢谢
      • 是的,main 的结果是 shell 将看到的值。
      • @Chris - shell 看到的值受main 返回的影响。但是,它们不一定是相同的值。尝试返回 1,024,你可能会在 shell 中得到零!
      • 从技术上讲,不能保证main 的返回值是如何“从外部”映射的。唯一的保证是返回EXIT_SUCCESS0(可能是同一件事)会报告成功完成,返回EXIT_FAILURE会报告错误;任何其他值都是实现定义的。也就是说,在 Unix 和 Windows 上,翻译都是直接的。
      【解决方案4】:

      返回整数的标准 C 函数通常返回大于或等于 0 表示成功,返回 -1 表示失败。当返回 -1 时,errno 通常设置为提供更具体的错误。零表示一般成功,其中大于零的数字被假定为成功并提供更多详细信息。

      考虑类似recvfrom()。返回值 -1 表示完全失败,errno 设置为详细代码。返回值为零意味着套接字以有序的方式关闭,并且额外的调用不会返回数据。返回值大于零表示接收到数据,接收到的字节数就是返回的内容。

      【讨论】:

        【解决方案5】:

        我理解您要问两个问题:

        • 如何在 c++ 中返回程序状态
        • 函数如何在 C++ 中返回状态

        基本答案如下。

        通常程序 (main()) 返回 0 表示成功,其他值 - 错误 - 表示失败

        如果一个函数可以成功或失败,它通常被键入为 bool 并返回 truefalse

        如果一个函数可以返回多个值,它通常会返回 intenum 值。

        尝试为那些异常的情况抛出异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 2020-06-17
          相关资源
          最近更新 更多