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

时间:2015-11-26 23:43:39

标签: c posix gnu glibc errno

sys_errlist是一个方便的数组,允许获取静态errno描述。它的替代方案是strerror_r函数,它有两种令人困惑的不兼容的风格。它的GNU版本返回char *,只要错误已知,它将来自相同的上述数组,或者来自用户提供的缓冲区。符合标准的strerror_r版本会返回int,并始终使用用户提供的缓冲区。问题是,尽管语义完全不同,这两个函数共享相同的名称,因此您基本上必须执行相当复杂的#ifdef检查,并根据您获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比sys_errlist差,因为两者都要求调用者提供一个“足够大”的缓冲区来保存描述,即使GNU版本很少使用它,也没有函数允许知道缓冲区应该有多大。相反,如果您选择使用sys_errlist,则只需检查value >= sys_nerr是否仅在这种情况下分配缓冲区,只需通过Unknown error %dsnprintf放在那里,完成。

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

1 个答案:

答案 0 :(得分:-2)

strerror及其亲属已本地化。可以讨论非本地化系统消息的有用性,但是glibc的维护者采用了主导方向(Solaris和其他系统)。

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

进一步阅读:

已经有一段时间了,因为这是一个问题,但过去有些系统没有strerror(见Unix Incompatibility Notes: String and Memory Functions)。