我是以色列理工学院计算机科学专业的学生,我刚刚了解到errno
变量和 C 风格函数调用。
这让我想知道,如果 c 风格的系统调用使用寄存器来返回值,为什么有人应该使用errno
at all?
使用的主要原因errno
是提供有关错误情况的更多信息。
这在大多数(甚至是all)函数的可能返回值实际上是valid返回值。
考虑fopen()
函数,它返回一个指向FILE
。每个可能的返回值也是有效的返回值,除了NULL
. So fopen()
回报NULL
失败时。但这样你就无法判断到底是什么导致了该函数失败。因此,fopen()
uses errno
表示确切的错误情况,即文件不存在,或者您无权读取它,或者系统内存不足,或者其他什么。
你可以想到errno
作为全局变量(在线程流行之前一直如此)。如今,errno
通常是一个包装返回错误条件的函数调用的宏。但这只是 C 实现线程特定全局变量的方式。
的替代方案errno
不太舒服:
您可以提供一个带有指向int
,并且该函数可以将其错误条件存储在那里。strtod()
是这种技术的一个很好的例子。但这使得 API 更加复杂,因此不太理想。此外,它还迫使程序员定义一个新的int
,如果你不关心函数是否失败,这会很烦人。
在允许多个返回值(并且不具有异常)的语言中,通常返回两个值:一个用于实际结果,另一个表示错误条件。在 Go 等语言中,您会看到如下代码:
result, ok = foo();
if (ok) {
// handle error denoted by "ok"
}
不要相信这样声称的人errno
是一种“旧”技术,因此应避免。您正在编程的机器远比errno
甚至是C,而且没有人对此抱怨过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)