来自 man 3 strerror:
int strerror_r(int errnum, char *buf, size_t buflen);
/* XSI-compliant */
char *strerror_r(int errnum, char *buf, size_t buflen);
/* GNU-specific */
...
此函数有两个版本:POSIX.1-2001 中指定的 XSI 兼容版本(自 glibc 2.3.4 起可用,但直到 glibc 2.13 才兼容 POSIX)和 GNU 特定版本(自 glibc 2.0 起可用) . XSI 兼容版本提供了概要中显示的功能测试宏设置;否则提供 GNU 特定版本。
glibc 真的提供这两个功能吗?如果是这样,链接器如何区分它们。在链接方面,所有预处理器定义都消失了,那么这里发生了什么?