来自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真的提供这两种功能吗?如果是这样,链接器如何区分它们。当谈到链接时,所有预处理器定义都消失了,所以这里发生了什么?
答案 0 :(得分:2)
查看<string.h>
。使用符合XSI的版本时,它使用宏重新定义strerror_r
:
# define strerror_r __xpg_strerror_r
链接器中没有混淆,因为xpg_strerror_r
是一个不同的功能。