Das eigentliche errno
-Werte werden nicht durch die C- und C++-Standards definiert. Es gibt also keine Möglichkeit, eine bestimmte (positive) Ganzzahl zurückzugeben und zu garantieren, dass sie nicht mit derjenigen kollidiert, die eine Implementierung verwendet. Der C-Standard erfordert nur drei Marco:
C11 Entwurf, 7.5 Fehler
Die Makros sind
EDOM
EILSEQ
ERANGE
die sich zu ganzzahligen konstanten Ausdrücken vom Typ int erweitern lassen, deutlich positive Werte aufweisen und für die Verwendung in #if-Vorverarbeitungsanweisungen geeignet sind;
Sie wissen also nicht, welche anderen errno
Werte werden in Ihrer Implementierung definiert.
Die errno
Werte sind positive Ganzzahlen in Standard-C und POSIX. Sie könnten also Ihre eigene Aufzählung mit negativen Werten verwenden, um Ihre eigenen Fehlernummern zu definieren. Aber dann können Sie die strerror/perror-Schnittstellen nicht verwenden. Daher benötigen Sie möglicherweise einen zusätzlichen Wrapper für strerror/perror, um Ihre eigenen Fehlernummern zu interpretieren.
Etwas wie:
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);
}
und ein ähnliches für perror
.
Beachten Sie, dass Sie auch errno
festlegen sollten bis 0
bevor Sie Ihre "Open-Ressource" aufrufen, um sicherzustellen, dass errno
wurde tatsächlich von Ihrer Funktion gesetzt.
In solchen Situationen würde ich die Standard-Errno ganz vermeiden und meine eigene Enumeration für Fehler definieren. Sie könnten das tun, wenn Ihre "Open-Ressource" nicht zu kompliziert ist und zu viele mögliche Fehlercodes zurückgibt.