Le véritable errno
les valeurs ne sont pas définies par les normes C et C++. Il n'y a donc aucun moyen de renvoyer un entier (positif) particulier et de garantir qu'il n'entre pas en conflit avec celui utilisé par une implémentation. Le standard C ne nécessite que trois marco :
Brouillon C11, 7.5 Erreurs
Les macros sont
ÉDOM
EILSEQ
ERANGEqui se développent en expressions constantes entières avec le type int, des valeurs positives distinctes, et qui conviennent pour une utilisation dans #if preprocessingdirectives ;
Donc vous ne savez pas quels autres errno
les valeurs sont définies dans votre implémentation.
Le errno
les valeurs sont des entiers positifs en C standard et POSIX. Vous pouvez donc utiliser votre propre énumération avec des valeurs négatives pour définir vos propres numéros d'erreur. Mais vous ne pouvez alors pas utiliser les interfaces strerror/perror. Vous aurez donc peut-être besoin d'un wrapper supplémentaire pour strerror/perror afin d'interpréter vos propres numéros d'erreur.
Quelque chose comme :
enum myErrors{
ERR1 = -1,
ERR2 = -2,
...
ERR64 = -64
};
char *my_strerror(int e)
{
if (e>=ERR1 && e<=ERR2)
return decode_myerror(e); // decode_myerror can have a map for
//your error numbers and return string representing 'e'.
else
return strerror(e);
}
et un similaire pour perror
.
Notez que vous devez également définir errno
à 0
avant d'appeler votre "open-ressource" pour vous assurer que le errno
a bien été défini par votre fonction.
J'éviterais complètement l'errno standard dans des situations comme celle-ci et définirais ma propre énumération pour les erreurs. Vous pouvez le faire si votre "ressource ouverte" n'est pas trop compliquée et renvoie trop de codes d'erreur possibles.