为什么 glibc 中不推荐使用“sys_errlist”?

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 %dvia 放在那里snprintf即可完成。

鉴于这strerror_r是一种可怕的、难以理解的和低效的混乱,为什么 GNU 开发人员将其标记为已弃用,从而有效地迫使人们在每次编译代码时sys_errlist使用或观察丑陋的警告?strerrror_r

Tho*_*key 1

strerror及其亲戚是本地化的。非本地化系统消息的有用性可能存在争议,但 glibc 的维护者遵循了流行的方向(Solaris和其他系统)。

但是:sys_errlist已经被弃用很长一段时间了。它不是 POSIX 接口。有些系统没有它。

进一步阅读:

这个问题已经有一段时间了,但以前某些系统没有这种情况strerror(请参阅Unix 不兼容注释:字符串和内存函数)。

  • 这实际上根本没有回答这个问题。`sys_errlist` 是一个静态数组,并且是完全线程安全的。 (2认同)