我应该从C函数返回TRUE/FALSE值吗?

Leo*_*ard 12 c return-value

在用C编程好几年之后,我意识到我一直忽略了从函数返回零以表示成功的C约定.这个惯例对我来说在语义上是错误的,因为零当然是错误的.问题是我喜欢命名函数is_valid_foobar(),为了适应"虚假意味着成功"的惯例,我必须更加模糊......而不是:

if ( ! is_valid_foobar() ) {
    return (error);
}
Run Code Online (Sandbox Code Playgroud)

其他程序员写道:

if ( validate_foobar() ) {
     return (error);
}
Run Code Online (Sandbox Code Playgroud)

我的实现看起来像:

int is_valid_foobar (int foobar ) {
     if ( foobar < MAX_ALLOWED ) {
          return TRUE;
      }
      return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

在代码审查中,我实际上并未发现任何问题.所以我认为这不是一个可怕的习惯,但它是"非常规的".我很好奇人们的想法.

我对功能和变量名称的选择非常谨慎,典型的评论评论是"代码非常清晰",而且根本不需要!在前面输入额外的内容.函数调用.但你怎么说,哦,强大的SO?

Pau*_*oub 19

我说两者都是正确的,出于不同的目的:

如果您正在执行简单的go/no-go验证,例如is_numeric(),那么true和false可以很好地工作.

对于更复杂的东西,0 ==成功范例是有用的,因为它允许返回多个错误条件.

在这种情况下,调用者可以简单地对0进行测试,或者检查非0返回以获得更具体的失败解释.例如,文件打开调用可能由于不存在,权限不足等原因而失败.


Chu*_*uck 11

这个惯例并不是你想象的那样.进程应以0状态退出以指示成功,返回错误代码的函数通常使用0表示"无错误".但作为布尔值,0应该表示false,非零表示true.要使用0表示布尔值,有一天你会得到每日WTF.


Joa*_*uer 6

我编程C已经有一段时间,但我认为你在谈论两种不同的功能:

  • is_foo是一个函数,它检查一些属性foo和returns 0(false)或non 0(true)来指示该属性的布尔值.调用这些函数时,不会出现错误状态(如果发生错误状态,则会映射到其中一个值).
  • foo是一个执行动作foo的函数.它0在成功时返回,0在错误时返回非值.


Ivy*_*ike 5

特别是当您将函数命名为 is_foo() 时,标准 C 字符函数(isdigit()、isupper() 等)是按照您的方式进行操作的良好先例。