dra*_*oot 5 c posix gnu glibc errno
sys_errlist
是一个方便的数组,允许获取静态errno
描述。它的替代方案是strerror_r
函数,它有两种令人困惑的不兼容的风格。它的 GNU 版本返回char *
,只要错误已知,它将来自上述相同的数组,否则来自用户提供的缓冲区。符合标准的版本strerror_r
返回 anint
相反,并且始终使用用户提供的缓冲区。问题是,这两个函数尽管具有完全不同的语义,但共享相同的名称,因此您基本上必须执行相当复杂的检查#ifdef
,并根据您获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比 更糟糕sys_errlist
,因为两者都要求调用者提供一个“足够大”的缓冲区来保存描述,即使 GNU 版本很少使用它,并且两个函数都不允许知道如何使用缓冲区确实应该很大。如果您选择使用sys_errlist
,您可以简单地检查是否value >= sys_nerr
并仅在这种情况下分配缓冲区,只需将Unknown error %d
via 放在那里snprintf
即可完成。
鉴于这strerror_r
是一种可怕的、难以理解的和低效的混乱,为什么 GNU 开发人员将其标记为已弃用,从而有效地迫使人们在每次编译代码时sys_errlist
使用或观察丑陋的警告?strerrror_r
strerror
及其亲戚是本地化的。非本地化系统消息的有用性可能存在争议,但 glibc 的维护者遵循了流行的方向(Solaris和其他系统)。
但是:sys_errlist
已经被弃用很长一段时间了。它不是 POSIX 接口。有些系统没有它。
进一步阅读:
这个问题已经有一段时间了,但以前某些系统没有这种情况strerror
(请参阅Unix 不兼容注释:字符串和内存函数)。