gpt4 book ai didi

c - 为什么要使用 'errno'?

转载 作者:太空狗 更新时间:2023-10-29 15:11:06 29 4
gpt4 key购买 nike

我是 Technion 的 CS 学生,我刚刚学习了 errno 变量和 c 风格的函数调用。这让我想知道,如果 c 风格的系统调用使用寄存器返回一个值,为什么还要使用 errno

最佳答案

使用 errno 的主要原因是提供有关错误情况的更多信息。

这在函数的大多数(甚至所有)可能返回值实际上是有效返回值的情况下特别有用。

考虑 fopen() 函数,它返回指向 FILE 的指针。除了 NULL 之外,每个可能的返回值也是有效的返回值。所以 fopen() 在失败时返回 NULL。但是你无法判断究竟是什么导致了函数失败。因此,fopen() 使用 errno 来表示确切的错误情况,即文件不存在,或者您没有读取它的权限,或者系统内存不足或其他原因。

您可以将errno 视为一个全局变量(在线程流行之前它一直是全局变量)。现在,errno 通常是一个宏,包装了一个返回错误条件的函数调用。但这只是 C 实现线程特定全局变量的方式。

errno 的替代方案不太舒服:

您可以为一个函数提供一个指向 int 的指针,该函数可以将其错误条件存储在那里。 strtod() 是这种技术的一个很好的例子。但这会使 API 更复杂,因此更不理想。此外,它会强制程序员定义一个新的 int,如果您不关心函数是否失败,这会很烦人。

在允许多个返回值(并且不包含异常)的语言中,返回两个值是很常见的:一个用于实际结果,另一个用于表示错误情况。在 Go 等语言中,您会看到如下代码:

result, ok = foo();
if (ok) {
// handle error denoted by "ok"
}

不要相信那些声称 errno 是一种“旧”技术因此应该避免的人。您正在编程的机器比 errno 甚至 C 都老得多,而且从来没有人提示过这一点。

关于c - 为什么要使用 'errno'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com