C或C++返回状态

Jas*_*ell 6 c c++ function status return-value

编写返回表示状态代码的int的C或C++函数的最佳实践是什么?

具体来说,我想了解客户端使用情况,但欢迎其他提示.

例如,我可以写这样的东西:

int foo() {
  return 0;  // because everything was cool
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它?

if (foo()) {
  // what to do if false, e.g. non-zero, e.g. not OK
} else {
  // what to do if true, e.g. zero, e.g. OK
}
Run Code Online (Sandbox Code Playgroud)

这应该有效,因为最佳实践通常要求状态代码0表示一切正常,也0意味着false在布尔语句中.

但是,这不会很好,对:

if (!foo()) {
  // what to do if true
} else {
  // what to do if false
}
Run Code Online (Sandbox Code Playgroud)

Osc*_*orz 9

我在C工作中使用它:

int err = foo();
if (err) {
    // armageddon
}
Run Code Online (Sandbox Code Playgroud)

赋值和if可以组合,但是更复杂的函数调用会让人感到更加困惑,有些人会因条件中的赋值而感到困惑(而gcc讨厌它).

对于C++,如果可用的话我会更喜欢异常,否则就是上面的.

编辑:我建议在成功时返回0,其他任何错误.这就是unix命令行实用程序所做的事情.

  • 我想补充一点**原因**它通常最好在成功时返回0而非零错误(与布尔1/0意味着真/假相反)是通常有很多原因导致操作失败但只有一种类型成功. (6认同)
  • 就其本身而言,这无关紧要.0的意义在于程序员是懒惰的,这允许简洁的`if(foo())`工作.成功可以很容易就是42,我们都可以写'if(foo()!= 42)` (2认同)

adp*_*mbo 5

如果您真的想以这种方式使用状态代码,请将它们与描述状态代码意图的一个enum或一组#define语句一起使用.

例如:

enum
{
   kSuccess = 0,
   kFailure = -1,
}

function foo()
{
    return kSuccess;
}

if (kSuccess == foo())
{
    // Handle successful call to foo
}
else
{
    // Handle failed call to foo
}
Run Code Online (Sandbox Code Playgroud)

这样,意图很明确,并且当有人想要在将来使用或维护您的代码时,不会出现容易出错的猜测.