在C语言中,一个函数如何返回一个lvalue?

3
我在《Linux编程接口》的第29-2章节中读到以下内容:“在Linux上,线程特定的errno的实现方式与大多数其他UNIX实现方式相似:errno被定义为一个宏,该宏展开为一个函数调用,返回一个可修改的lvalue,每个线程都具有其不同的值。” 我想知道如何让函数返回可修改的lvalue。

5
一个函数不能返回可修改的左值。但是一个函数可以返回一个指针,而 errno 可以被定义为一个宏,它会扩展成类似于 *per_thread_errno_function() 的东西。因此,该函数不返回左值,但是 errno 宏的扩展是一个左值。另请参见这个答案 - Steve Summit
1个回答

7

它是宏,"返回"可修改的lvalue,而不是函数调用本身。该函数返回指针,宏解引用此指针。例如,glibc源代码的{{link1:errno.h}}定义了宏errno如下:

# define errno (*__errno_location ())

这个措辞有点误导:

errno 被定义为一个宏,该宏会展开成一个函数调用,返回一个可修改的左值,每个线程都是独立的。

更准确的措辞应该是:

errno 被定义为一个宏,该宏会展开成包含一个函数调用的表达式。这个表达式的求值结果是一个可修改的左值,每个线程都是独立的。


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