您应该在C中使用失败的函数调用返回什么值?

可能重复:
C代码中的error handling

假设你有一个function:

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

x和y应该是什么?

因为我有另一个function:

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

我知道对于这个特定的例子,使用返回值1将使第二个代码块“do stuff#1”并且使用返回值0将第二个代码块带到“do stuff#2”

我的问题是C中首选的样式是什么? 函数的返回值0表示成功,其他任何值表示失败吗? 或相反亦然? 或者0以下的值?

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

对于非指针成功/失败:

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

对于指针函数:

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

在条件上下文中,如果整数为零,则整数求值为“true”,如果为零则整数求值为“false”,因此如果要以这种方式使用函数,则应该在失败时返回0 ,并确保返回0在成功的分支。

两者都使用,通常取决于是否可以返回多个错误代码。

如果你的函数只是“成功”或“失败”而没有附加信息,我建议你为失败返回0 ,为成功返回1 ,因为它更简单,语义更有效。

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

没有一个正确的答案。

如果您的函数被命名/记录为对某种谓词的求值,那么它应该返回非零值(如果方便则为1)为“true”,0为false。

如果你的函数返回一个指针,那么0(空指针)就是报告失败的唯一合理方法。 返回(void *)-1MAP_FAILEDSEM_FAILEDSEM_FAILED是可怕的,不应复制。 如果需要报告失败原因,请添加一个额外的int *errorcode参数并包含if (errorcode) *errorcode = reason; 在函数结束时允许调用者不关心传递空指针的原因。

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

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

1 =真0 =假

一般来说….

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

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

在我看来,两者都可以工作,但在不同的情况下。

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

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

使用#define。

 #define TRUE 1 #define FALSE 0 

这有助于任何其他人理解您对真值和假值的标准选择。 此外,如果程序代码变大,跟踪常量变得困难并且可能会混淆。 将#define用于常量总是一种很好的做法。