sys_errlist
是一个方便的数组,允许获得静态errno
描述。它的替代方案是strerror_r
函数,它有两种令人困惑的不兼容风格。它的GNU版本返回char *
,只要错误是已知的,该GNU版本可能来自同一个上述阵列,或者来自用户提供的缓冲区。 strerror_r
的符合标准的版本将返回int
,并且始终使用用户提供的缓冲区。问题是,尽管这两个函数的语义完全不同,但这两个函数共享相同的名称,因此您必须执行相当复杂的#ifdef
检查,并根据您获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比sys_errlist
差,因为这两个函数都要求调用者提供足够大的缓冲区来保存描述,尽管GNU版本很少使用它,并且这两个函数都不允许知道缓冲区应该有多大。如果您改为选择使用sys_errlist
,您可以简单地检查是否仅在这种情况下分配缓冲区value >= sys_nerr
,以便通过snprintf
将Unknown error %d
并且完成。为什么在glibc中不推荐使用'sys_errlist'?
鉴于strerror_r
是一个可怕的,不可理解的和低效的一塌糊涂,为什么GNU开发标志着sys_errlist
为过时,有效地迫使一个要么使用strerrror_r
或每个代码编译时间来观察丑陋的警告?
这实际上并没有回答这个问题。 'sys_errlist'是一个静态数组,并且完全是线程安全的。 –
glibc中有很多非标准的东西,其用法似乎没有伴随编译时弃用警告 – dragonroot
Glibc提供的接口*吨*不符合POSIX,并且不被弃用。 –