sys_errlist
est un tableau pratique qui permet d'obtenir des descriptions statiques errno
. L'alternative à cela est la fonction strerror_r
, qui est disponible dans deux saveurs incompatibles confus. La version GNU de celui-ci renvoie char *
, qui proviendrait du même tableau mentionné ci-dessus tant que l'erreur est connue, ou autrement à partir du tampon fourni par l'utilisateur. La version conforme aux normes de strerror_r
renvoie à la place un int
et utilise toujours le tampon fourni par l'utilisateur. Le problème est que ces deux fonctions partagent le même nom malgré des sémantiques complètement différentes, donc vous devez effectuer une vérification #ifdef
plutôt complexe et écrire deux versions complètement différentes de votre code en fonction de la version que vous obtenez. En plus de cela, ces deux fonctions sont pires que sys_errlist
, car les deux exigent que l'appelant fournisse un tampon "assez grand" pour contenir la description, même si la version GNU l'utiliserait rarement, et aucune des deux fonctions ne permet de savoir juste quelle devrait être la taille du tampon. Si à la place vous choisissez d'utiliser sys_errlist
à la place, vous pouvez simplement vérifier si value >= sys_nerr
et allouer le tampon seulement dans ce cas, juste pour mettre le Unknown error %d
là par snprintf
, et être fait.Pourquoi 'sys_errlist' est-il déprécié dans la glibc?
Étant donné que strerror_r
est un gâchis horrible, incompréhensible et inefficace, pourquoi les développeurs GNU marque sys_errlist
comme dépréciée, ce qui oblige effectivement un à utiliser soit strerrror_r
ou d'observer l'avertissement laid chaque fois que le code est compilé?
Cela ne répond pas du tout à la question. 'sys_errlist' est un tableau statique et est complètement thread-safe. –
Il y a beaucoup de choses non standard dans la glibc dont l'utilisation ne semble pas s'accompagner d'avertissements de désapprobation à la compilation – dragonroot
Il existe une * ton * d'interfaces fournies par Glibc qui ne sont pas compatibles POSIX, et ne sont pas déconseillés. –