El errno
real los valores no están definidos por los estándares C y C++. Por lo tanto, no hay forma de devolver un número entero (positivo) en particular y garantizar que no entre en conflicto con el que usa una implementación. El estándar C requiere solo tres marcos:
Borrador C11, 7.5 Errores
Las macros son
Edom
EILSEQ
RANGO
que se expanden a expresiones constantes enteras con tipo int, distintos valores positivos, y que son adecuadas para usar en directivas de preprocesamiento #if;
Así que no sabes qué otros errno
los valores se definen en su implementación.
El errno
los valores son enteros positivos en C estándar y POSIX. Entonces podría usar su propia enumeración con valores negativos para definir sus propios números de error. Pero entonces no puede usar las interfaces strerror/perror. Por lo tanto, es posible que necesite un envoltorio adicional para strerror/perror para interpretar sus propios números de error.
Algo como:
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);
}
y uno similar para perror
.
Tenga en cuenta que también debe configurar errno
a 0
antes de llamar a su "recurso abierto" para asegurarse de que errno
de hecho fue establecido por su función.
Evitaría el errno estándar por completo en situaciones como esta y definiría mi propia enumeración de errores. Podría hacerlo si su "recurso abierto" no es demasiado complicado y devuelve códigos de error demasiado posibles.