【问题标题】:What return value should you use for a failed function call in C? [duplicate]对于 C 中失败的函数调用,您应该使用什么返回值? [复制]
【发布时间】:2011-12-28 07:47:36
【问题描述】:

可能重复:
Error handling in C code

假设你有一个函数:

int MightWork(){
  // if it works
  return x;

  // if it fails
  return y;

}

x 和 y 应该是什么?

因为我还有另一个功能:

if (MightWork){
  // do stuff #1
}else{
  // do stuff #2
}

我知道对于这个特定的示例,使用返回值 1 将使第二个代码块“执行 #1”,而使用返回值 0 将使第二个代码块“执行 #2”

我的问题是 C 中的首选风格是什么?函数的返回值为 0 是否表示成功,而任何其他值是否表示失败?或相反亦然?还是低于 0 的值?

我想确保我正在使用当前样式编写我的 C 代码。谢谢!

【问题讨论】:

标签: c


【解决方案1】:

对于非指针成功/失败:

  • 0 => 成功
  • -1 => 失败

对于指针函数:

  • NULL => 失败
  • 其他一切 => 成功

【讨论】:

  • 您是否使用 -1 作为一种以紧凑方式检测多个调用中的错误的方法?例如。 err += func1(); err += func2(); if (err<0) printf("error");
  • 所以如果成功是返回值 0,那么这些是等效的语句:“if(my_function())”和“if(my_function() == 0)”吗?
  • 不,成功由0 标记,等效调用将是if(!my_function())if(my_function() == 0)
【解决方案2】:

两者都用,一般看能否返回多个错误码。

如果您的函数只会“成功”或“失败”而没有其他信息,我建议您返回 0 表示失败并返回 1 表示成功,因为它更简单且在语义上更有效。

如果您的函数可能因多个状态代码而失败,唯一的方法是使用 0 表示成功,使用其他值表示失败,表示不同的状态。

【讨论】:

    【解决方案3】:

    在条件上下文中,如果整数非零,则计算结果为“真”,如果为零,则计算结果为“假”,因此如果您想以这种方式使用该函数,则应在失败时返回 0,并使确定在成功的分支中返回0

    【讨论】:

      【解决方案4】:

      没有一个正确的答案。

      如果您的函数被命名/记录为对某种谓词的评估,那么它应该返回一个非零值(如果方便,则为 1)表示“真”,0 表示假。

      如果您的函数返回一个指针,0(空指针)几乎是报告失败的唯一合理方式。返回(void *)-1MAP_FAILEDSEM_FAILED 等约定是可怕的,不应复制。如果您需要报告失败的原因,请添加一个额外的int *errorcode 参数并在函数末尾包含if (errorcode) *errorcode = reason;,以允许不关心原因的调用者传递空指针。

      如果您的函数返回的数值只有特定的范围值才有意义(例如,只有非负整数,或只有有限的浮点值),那么请使用超出范围的值作为错误代码(例如负整数或NaN/无穷大)作为错误代码。如果您没有足够的可能代码(例如只有 NaN),请使用上述int *errorcode 方法。

      【讨论】:

        【解决方案5】:

        从历史上看,0 的返回值通常表示成功,而-1 的返回值表示失败。您还可以使用更多输出值来为函数的用户提供有关返回状态的更详细信息。设置全局错误代码变量是另一种传统,参见例如GetLastErrorSetLastError 在 Windows 上。

        【讨论】:

          【解决方案6】:

          1 = 真 0 = 假

          一般......

          有时人们使用 -1 表示“错误”

          另一种处理方法是使用枚举,有时使用#defines。虽然很多时候人们不会使用它,除非有很多错误......而且通常多个错误由各种负数处理。

          【讨论】:

            【解决方案7】:

            我认为两者都可以工作,但情况不同。

            1. 如果你让函数做一些操作,成功返回0,失败返回-1, 并将errno 设置为适当的值,以便调用者可以检查它以了解失败的详细信息。 有时人们也会使用不同的返回值来表示不同的失败。

            2. 如果你想让函数测试一些条件,你应该让它返回 TRUEFALSE,稍后使用 if (XXX() == TRUE)。不建议使用if (XXX()) 的形式,尽管很多人这样做是为了节省键入键盘的时间。 TRUEFALSE 不是 C 中的内置数据类型,但是许多编程环境会将其定义为 TRUE = 1FALSE = 0,如果您不在这样的环境中工作,您可以自己做。

            【讨论】:

              【解决方案8】:

              使用#define。

              #define TRUE 1
              #define FALSE 0
              

              这有助于任何其他人了解您选择的真假值标准。 此外,如果程序代码变得更大,那么跟踪常量就会变得困难并且可能会造成混淆。对常量使用#define 始终是一个好习惯。

              【讨论】:

                猜你喜欢
                • 2011-01-14
                • 2018-06-03
                • 1970-01-01
                • 2016-03-09
                • 2012-12-04
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多