在用C编程好几年之后,我意识到我一直忽略了从函数返回零以表示成功的C约定.这个惯例对我来说在语义上是错误的,因为零当然是错误的.问题是我喜欢命名函数is_valid_foobar()
,为了适应"虚假意味着成功"的惯例,我必须更加模糊......而不是:
if ( ! is_valid_foobar() ) { return (error); }
其他程序员写道:
if ( validate_foobar() ) { return (error); }
我的实现看起来像:
int is_valid_foobar (int foobar ) { if ( foobar < MAX_ALLOWED ) { return TRUE; } return FALSE; }
在代码审查中,我实际上并未发现任何问题.所以我认为这不是一个可怕的习惯,但它是"非常规的".我很好奇人们的想法.
我对功能和变量名称的选择非常谨慎,典型的评论评论是"代码非常清晰",而且根本不需要!
在前面输入额外的内容.函数调用.但你怎么说,哦,强大的SO?
我说两者都是正确的,出于不同的目的:
如果您正在执行简单的go/no-go验证,例如is_numeric(),那么true和false可以很好地工作.
对于更复杂的东西,0 ==成功范例是有用的,因为它允许返回多个错误条件.
在这种情况下,调用者可以简单地对0进行测试,或者检查非0返回以获得更具体的失败解释.例如,文件打开调用可能由于不存在,权限不足等原因而失败.
这个惯例并不是你想象的那样.进程应以0状态退出以指示成功,返回错误代码的函数通常使用0表示"无错误".但作为布尔值,0应该表示false,非零表示true.要使用0表示布尔值,有一天你会得到每日WTF.
我编程C已经有一段时间,但我认为你在谈论两种不同的功能:
is_foo
是一个函数,它检查一些属性foo和returns 0
(false
)或non 0
(true
)来指示该属性的布尔值.调用这些函数时,不会出现错误状态(如果发生错误状态,则会映射到其中一个值).
foo
是一个执行动作foo的函数.它0
在成功时返回,0
在错误时返回非值.