sys_errlist
是一个方便的数组,允许获取静态errno
描述。它的替代方案是strerror_r
函数,它有两种令人困惑的不兼容的风格。它的GNU版本返回char *
,只要错误已知,它将来自相同的上述数组,或者来自用户提供的缓冲区。符合标准的strerror_r
版本会返回int
,并始终使用用户提供的缓冲区。问题是,尽管语义完全不同,这两个函数共享相同的名称,因此您基本上必须执行相当复杂的#ifdef
检查,并根据您获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比sys_errlist
差,因为两者都要求调用者提供一个“足够大”的缓冲区来保存描述,即使GNU版本很少使用它,也没有函数允许知道缓冲区应该有多大。相反,如果您选择使用sys_errlist
,则只需检查value >= sys_nerr
是否仅在这种情况下分配缓冲区,只需通过Unknown error %d
将snprintf
放在那里,完成。
鉴于strerror_r
是一个可怕的,难以理解和低效的混乱,为什么GNU开发人员将sys_errlist
标记为已弃用,有效地迫使他们使用strerrror_r
或观察每个人的丑陋警告代码编译的时间?
答案 0 :(得分:-2)
strerror
及其亲属已本地化。可以讨论非本地化系统消息的有用性,但是glibc的维护者采用了主导方向(Solaris和其他系统)。
但是:sys_errlist
已被弃用了很长一段时间。它不是POSIX接口。有些系统没有它。
进一步阅读:
已经有一段时间了,因为这是一个问题,但过去有些系统没有strerror
(见Unix Incompatibility Notes:
String and Memory Functions)。