理解 C 语言 errno

4
在我的系统中,errno 被定义为:
int *    __error(void);
#define errno    (* __error())

我了解errno是一个宏,会扩展为* __error()函数:

  1. 我在所有地方(我的系统上的源代码)搜索,但找不到__error()函数的定义,请问有人能够展示/解释一下应该如何定义吗?

  2. 以上定义中errno = 0表达式的工作原理是什么(将0赋值给一个函数)?errno = 0会扩展为* __error() = 0吗?

谢谢!


请问,“我的系统”是什么,以供参考? - Lightness Races in Orbit
1个回答

9
__error函数返回调用线程的errno变量的指针。errno宏对该指针进行解引用,生成一个左值,该左值可以出现在等号的任一侧。
回答您的问题:
1. 该函数确定特定线程的errno变量的正确地址。每个线程都有自己的errno变量。 2. 是的,它变成了(* __error()) = 0;,这将把0赋值给该线程的errno变量。

2
谢谢您的回答,这意味着我的操作系统中某个函数__error()有一个定义为int * __error() { return &errno; }的实现,我是对的吗?而且在.c文件中,errno是一个静态变量static int errno - Orion
4
@ManiH.:可能会更加复杂,返回的 errno 不会是全局变量,而是来自某种线程本地存储(即每个线程都有一个 errno 实例,并且 __error() 实现将检索指针以相对于当前线程的实例) 。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接