打印
[其它产品/技术]

C 语言函数返回值的行业潜规则

[复制链接]
656|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szt1993|  楼主 | 2024-9-28 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言函数的返回值
C语言函数可以通过返回值表示输出结果,例如 log() 函数的返回值会根据不同的输入,返回不同的值。再比如,我们定义一个函数 myopen(),用于打开某个文件,那么,这个函数要么能够成功打开文件,要么打开文件失败,这时,可以通过返回值区分“成功”和“失败”。
当然,myopen() 函数失败的原因可能很多,但不是本文关注的重点,本文更关心的是,该以何值表示“成功”,何值表示“失败”。
按照C语言语法, 0 表示假,非零(常常用 1)表示真,那是否函数也用 0 返回值表示“失败”,1 返回值表示“成功”呢?
行业“潜规则”
C语言函数当然可以使用返回值 0 表示“失败”,用返回值 1 表示“成功”。
事实上,C语言函数用什么样的返回值表示成功或者失败,只是一种人为的约定,函数的调用者遵守这个“约定”就可以了。
C语言也有“行业潜规则”,不过,对于一般的函数,大多数C语言程序员常常使用返回值 0 表示成功,非零值表示失败。因此,如果希望我们定义的函数能够被大多数人愉快的使用,最好不要反其道而行,遵守“行业潜规则”更好一点。
仔细考虑下,其实C语言函数使用返回值 0 表示成功是有原因的。更一般的C语言函数返回值并不一定只有两种可能值(成功/失败),它可能还会返回对应错误原因的返回值。总之,函数成功只有一种可能,函数失败却有多种可能。
实数要么是 0,要么非 0,因此可以将 0 看作一个比较特殊的“唯一”数值,使用 0 这个“唯一”的返回值,表示唯一的“成功”,多种非零的返回值,表示多种原因的失败,无疑更好一些。
当然,我们也可以说“实数要么是 1,要么非 1”,不过这显然也不是“行业潜规则”。
例如我们可以规定,如果 myopen() 函数因为“文件或者目录不存在”的原因失败,返回 -1,如果因为“权限不够”的原因失败,则返回 -2。-1 和 -2 都是“非零值”,而成功作为失败的对立面,也即“非零值”的对立面,myopen() 函数使用返回值 0 表示成功无可厚非。
另一种行业“潜规则”
当然,C语言程序员中还有一种“行业潜规则”。如果定义的函数是个布尔函数,也即返回值显式的使用类似于 bool 关键字定义,或者函数名类似于 is_true(),那么显然此时应该遵守C语言语法,使用“真”值表示成功,“假”值表示失败。
if( is_true() )
  printf("true\n");

请看上面这两行C语言代码,显然,遵守C语言语法的布尔函数更便于程序员写出布尔判断类的代码。
小结
本文主要讨论了C语言程序开发中关于函数返回值的问题。可见,使用什么样的返回值表示成功,什么用的返回值表示失败,其实只是一种人为约定。
只不过,如果希望我们编写的代码能够被大多数同行愉快的使用,最好遵守下“行业潜规则”。
当然了,若是希望我们的C语言代码应用性更广,则可以使用<stdlib.h>标准头文件里预先定义好的 EXIT_SUCCESS 和 EXIT_FAILURE 宏。


使用特权

评论回复
沙发
AdaMaYun| | 2024-9-30 10:52 | 只看该作者
如果定义的函数是个布尔函数,也即返回值显式的使用类似于 bool 关键字定义,或者函数名类似于 is_true(),那么显然此时应该遵守C语言语法,使用“真”值表示成功,“假”值表示失败。

使用特权

评论回复
板凳
suncat0504| | 2024-10-31 15:41 | 只看该作者
可以用宏定义啊。这个更直观。

使用特权

评论回复
地板
Amazingxixixi| | 2024-12-2 14:13 | 只看该作者
返回值是作为故障判断的标志

使用特权

评论回复
5
发GV第几啊| | 2025-4-30 23:24 | 只看该作者
在C语言中,大多数程序员遵循一个非正式的行业“潜规则”:函数的返回值0表示“成功”,而非零的值表示失败。

使用特权

评论回复
6
w2nme1ai7| | 2025-5-22 13:22 | 只看该作者
大多数C语言程序员遵循用返回值0表示成功,非零值表示失败的约定。这种约定源于早期Unix系统编程实践,因其逻辑清晰且利于代码维护而被广泛接受。

使用特权

评论回复
7
suw12q| | 2025-5-22 14:30 | 只看该作者
成功被视为唯一状态,而失败可能由多种原因导致。使用0表示成功、非零值表示失败,能清晰区分唯一成功状态与多种失败情况。例如在RTOS中,错误类型多达上百种,而成功状态唯一,用0表示成功更符合逻辑。

使用特权

评论回复
8
q1ngt12| | 2025-5-22 15:19 | 只看该作者
若函数返回值显式使用类似bool关键字定义,或函数名类似is_true(),应遵守C语言语法,用“真”值表示成功,“假”值表示失败。这种约定便于程序员编写布尔判断类代码。

使用特权

评论回复
9
tax2r6c| | 2025-5-22 18:07 | 只看该作者
函数返回值常用于错误处理,许多标准库函数在成功时返回0,失败时返回非零值。开发者应养成检查函数返回值的习惯,以便及时捕获和处理错误。

使用特权

评论回复
10
q1d0mnx| | 2025-5-22 19:13 | 只看该作者
非零返回值可进一步设计为对应不同错误原因的返回值。例如,规定myopen()函数因“文件或目录不存在”返回-1,因“权限不够”返回-2。这种设计通过不同非零值表示多种失败原因,便于问题排查。

使用特权

评论回复
11
g0d5xs| | 2025-5-22 21:50 | 只看该作者
为使代码更易理解和维护,便于不同程序员协作,应遵循用0表示成功、非零值表示失败的约定。

使用特权

评论回复
12
kaif2n9j| | 2025-5-23 09:12 | 只看该作者
在使用第三方库时,应遵循其返回值规则。若项目规则与第三方不一致,会导致调试和维护困难。

使用特权

评论回复
13
cen9ce| | 2025-5-23 10:23 | 只看该作者
返回值的类型必须与函数声明的返回类型一致,否则可能导致未定义行为。

使用特权

评论回复
14
ex7s4| | 2025-5-23 13:34 | 只看该作者
避免返回局部变量指针,函数不能返回指向局部变量的指针,因为函数结束后局部变量内存会被释放,可能导致未定义行为。

使用特权

评论回复
15
lix1yr| | 2025-5-23 15:08 | 只看该作者
建议总是检查函数的返回值,除非有充分理由忽略它,以避免潜在问题被忽视。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

332

主题

2586

帖子

6

粉丝