Skutečné errno
hodnoty nejsou definovány standardy C a C++. Neexistuje tedy žádný způsob, jak vrátit konkrétní (kladné) celé číslo a zaručit, že nebude v rozporu s tím, které implementace používá. Standard C vyžaduje pouze tři značky:
Koncept C11, chyby 7.5
Makra jsou
EDOM
EILSEQ
ERANGEkteré se rozšiřují na celočíselné konstantní výrazy s typem int, odlišnými kladnými hodnotami a které jsou vhodné pro použití v #if preprocessingdirectives;
Takže nevíte, jaké další errno
hodnoty jsou definovány ve vaší implementaci.
errno
hodnoty jsou kladná celá čísla ve standardním jazyce C a POSIX. Takže můžete použít svůj vlastní výčet se zápornými hodnotami k definování vlastních čísel chyb. Ale pak nemůžete použít rozhraní strerror/perror. K interpretaci vlastních čísel chyb tedy možná budete potřebovat další obal pro strerror/perror.
Něco jako:
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);
}
a podobný pro perror
.
Všimněte si, že byste také měli nastavit errno
na 0
než zavoláte svůj "open-resource", abyste se ujistili, že errno
byl skutečně nastaven vaší funkcí.
V takových situacích bych se úplně vyhnul standardnímu errno a definoval bych svůj vlastní výčet chyb. Můžete to udělat, pokud váš „otevřený zdroj“ není příliš komplikovaný a vrací příliš možné chybové kódy.