我阅读了 Linux 编程接口 29-2 线程和 errno 下一个:
在 Linux 上,线程特定的 errno 以与大多数其他 UNIX 实现类似的方式实现:errno 被定义为一个宏,它扩展为一个函数调用,返回一个可修改的左值,该左值对于每个线程都是不同的。
我想知道函数如何返回可修改的左值。
“返回”可修改左值的是宏,而不是函数调用本身。该函数返回一个指针,宏取消引用该指针。比如glibc源码的
errno.h
定义宏errno
是这样的:
# define errno (*__errno_location ())
这个措辞有点误导:
被定义为一个宏,它扩展为一个函数调用,返回一个可修改的左值,该左值对于每个线程都是不同的。errno
更准确的措辞是:
被定义为扩展为 包含函数调用的表达式的宏。该表达式的计算结果为 一个可修改的左值,该左值对于每个线程都是不同的。errno