2012-12-27 57 views
3

在我的系统errno定义为:了解ç错误号

int * __error(void); 
#define errno (* __error()) 

我明白errno是一个宏,扩展为* __error()功能:

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

  2. 表达式errno = 0如何与上述定义一起工作(将0分配给函数?)? errno = 0扩大到* __error() = 0

由于

+0

仅供参考,您可以告诉我们“我的系统”是什么吗? –

回答

7

__error函数返回一个指针调用线程的errno变量。 errno宏解引用那个指针,导致一个左值可以出现在等号的两边。

回答您的问题:

  1. 的功能决定的正确地址为特定线程errno变量。每个线程都有自己的。

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

+2

感谢您的回答,这意味着我的操作系统函数'__error()'有一个定义为'int * __error(){return &errno;}',我说得对吗?而'errno'是.c文件中的'static int errno' ?? – Orion

+3

@ManiH:可能会更复杂一些,返回的errno不会是全局的,而是来自某种线程本地存储(即每个线程都有一个“errno”实例,以及'__error()'实现将检索一个指向与当前线程相关的实例的指针)。 –