我在《Linux编程接口》的第29-2章节中读到以下内容:“在Linux上,线程特定的errno的实现方式与大多数其他UNIX实现方式相似:errno被定义为一个宏,该宏展开为一个函数调用,返回一个可修改的lvalue,每个线程都具有其不同的值。” 我想知道如何让函数返回可修改的lvalue。
它是宏,"返回"可修改的lvalue,而不是函数调用本身。该函数返回指针,宏解引用此指针。例如,glibc源代码的{{link1:errno.h
}}定义了宏errno
如下:
# define errno (*__errno_location ())
这个措辞有点误导:
errno
被定义为一个宏,该宏会展开成一个函数调用,返回一个可修改的左值,每个线程都是独立的。
更准确的措辞应该是:
errno
被定义为一个宏,该宏会展开成包含一个函数调用的表达式。这个表达式的求值结果是一个可修改的左值,每个线程都是独立的。
errno
可以被定义为一个宏,它会扩展成类似于*per_thread_errno_function()
的东西。因此,该函数不返回左值,但是errno
宏的扩展是一个左值。另请参见这个答案。 - Steve Summit