sys_errlist
是一个方便的数组,允许获取静态的errno
描述。它的替代方法是strerror_r
函数,可用于两种混淆不兼容的版本。其中GNU版本返回char *
,只要错误已知,就可以从同样的前面提到的数组中获取,否则就从用户提供的缓冲区中获取。标准兼容版的strerror_r
返回int
,并始终使用用户提供的缓冲区。问题在于,这两个函数尽管语义完全不同,但却共享相同的名称,因此您基本上必须执行相当复杂的#ifdef
检查,并根据获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比sys_errlist
更差,因为两者都需要调用者提供“足够大”的缓冲区来容纳描述,即使GNU版本很少使用它,而且两个函数都不允许了解缓冲区的实际大小。如果您选择使用sys_errlist
,则只需检查value >= sys_nerr
,并且只在这种情况下分配缓冲区,通过snprintf
将Unknown error %d
放在那里即可完成。
鉴于strerror_r
是一种可怕、难以理解且效率低下的混乱函数,为什么GNU开发人员会将sys_errlist
标记为过时的,从而迫使人们要么使用strerrror_r
,要么在每次编译代码时观察到丑陋的警告呢?
sys_errlist
是一个静态数组,完全线程安全。 - Jonathon Reinhartsys_errlist
并没有什么不安全的线程问题。 - Jonathon Reinhartvfork
的问题。 - undefined