L'attuale errno
i valori non sono definiti dagli standard C e C++. Quindi non c'è modo di restituire un particolare numero intero (positivo) e garantire che non entri in conflitto con quello utilizzato da un'implementazione. Lo standard C richiede solo tre marco:
Bozza C11, errori 7.5
Le macro sono
EDOM
EILSEQ
ERANGEche si espandono in espressioni costanti intere con tipo int, valori distinti positivi e che sono adatte per l'uso nelle direttive di pre-elaborazione #if;
Quindi non sai quale altro errno
i valori sono definiti nell'implementazione.
Il errno
i valori sono numeri interi postivi nello standard C e POSIX. Quindi potresti usare la tua enumerazione con valori negativi per definire i tuoi numeri di errore. Ma poi non puoi usare le interfacce strerror/perror. Quindi potresti aver bisogno di un wrapper aggiuntivo per strerror/perror per interpretare i tuoi numeri di errore.
Qualcosa come:
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);
}
e uno simile per perror
.
Nota che dovresti impostare anche errno
a 0
prima di chiamare la tua "risorsa aperta" per assicurarti che il errno
è stato effettivamente impostato dalla tua funzione.
Eviterei del tutto l'errno standard in situazioni come questa e definirei la mia enumerazione degli errori. Potresti farlo se la tua "risorsa aperta" non è troppo complicata e restituisce troppi possibili codici di errore.