了解C errno

Ori*_*ion 3 c libc

我的系统errno定义为:

int *    __error(void);
#define errno    (* __error())
Run Code Online (Sandbox Code Playgroud)

我理解errno是一个宏并扩展到* __error()功能:

  1. 我到处搜索(我的系统上的源代码),但我找不到__error()函数的定义,有人可以显示/解释它的定义是什么/应该是什么?

  2. 表达式如何errno = 0与上面的定义一起使用(分配0给函数?)?是errno = 0扩展到* __error() = 0

谢谢

Dav*_*rtz 7

__error函数返回指向errno调用线程变量的指针.的errno宏解引用该指针,从而可在任一侧上出现的一个等号左值.

回答你的问题:

  1. 该函数确定该errno特定线程的变量的正确地址.每个线程都有自己的.

  2. 是的,它变成(* __error()) = 0;了分配0给该线程的errno变量.

  • @ManiH:可能它会有点复杂,返回的`errno`不会是全局的,但会来自某种线程本地存储(即每个线程都有一个`errno`实例,并且`__ error()`实现将检索指向相对于当前线程的实例的指针. (3认同)
  • 感谢您的回答,这意味着我的OS函数`__ error()`中的某个地方的定义为`int*__error(){return&errno; 我是对的吗?并且`errno`在.c文件中是`static int errno` ?? (2认同)