c 中函数如何返回左值?

Moh*_*ad 3 c linux multithreading pthreads

我读了《Linux 编程接口 29-2 线程》和 errno下一个:

在 Linux 上,线程特定的 errno 的实现方式与大多数其他 UNIX 实现类似:errno 被定义为一个宏,该宏扩展为函数调用,返回每个线程不同的可修改左值。

我想知道函数如何返回可修改的左值。

And*_*zel 7

“返回”可修改左值的是宏,而不是函数调用本身。该函数返回一个指针,宏取消引用该指针。例如,errno.hglibc源代码中定义的宏errno是这样的:

# define errno (*__errno_location ())
Run Code Online (Sandbox Code Playgroud)

这个措辞有点误导:

errno被定义为一个宏,它扩展为一个函数调用,返回一个对于每个线程都是不同的可修改的左值。

更准确的措辞是:

errno定义为扩展为包含函数调用的表达式的宏。该表达式的计算结果是一个可修改的左值,该左值对于每个线程都是不同的。