2015-11-26 44 views
2

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

鉴于strerror_r是一个可怕的,不可理解的和低效的一塌糊涂,为什么GNU开发标志着sys_errlist为过时,有效地迫使一个要么使用strerrror_r或每个代码编译时间来观察丑陋的警告?

回答

-2

strerror及其相对值为本地化。非本地化系统消息的用处可以辩论,但glibc的维护人员按照主流方向(Solaris和其他系统)进行。

但是:sys_errlist已被弃用一段时间。它不是POSIX界面。有些系统没有它。

延伸阅读:

它已经因为同时这是一个问题,但它曾经是一些系统的情况d没有strerror(请参阅Unix Incompatibility Notes: String and Memory Functions)。

+0

这实际上并没有回答这个问题。 'sys_errlist'是一个静态数组,并且完全是线程安全的。 –

+0

glibc中有很多非标准的东西,其用法似乎没有伴随编译时弃用警告 – dragonroot

+0

Glibc提供的接口*吨*不符合POSIX,并且不被弃用。 –

相关问题