Na druhou část vaší otázky odpovídá strerror
(jak uvádíte), nebo lépe strerror_r
, ale v glibc
alespoň můžete jednoduše použít %m
jako specifikátor formátu.
První část je zajímavější, tedy jak získáte název konstanty C pro chybu. Domnívám se, že neexistuje způsob, jak toho dosáhnout pomocí standardního glibc
. Můžete si vytvořit své vlastní statické pole nebo hashovací tabulku, abyste to udělali relativně snadno.
Bohužel ne; E
nepodporuje introspekci chybová makra.
Můžete to udělat triviálně v Pythonu:
import errno
print(errno.errorcode[errno.EPERM])
Je to proto, že správci Pythonu si dali tu práci s generováním vyhledávací tabulky:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
V čem je problém?
perl -ne 'print "$1\n" if /^#\s*define\s+(E[A-Z0-9]+)/' < /usr/include/sys/errno.h | sort | uniq | perl -ne 'chomp; print " { $_, \"$_\" }\n"'
Tento příkaz unixového shellu vypíše E*
definuje z /usr/include/sys/errno.h
(kde skutečné definuje živé) ve tvaru { EINVAL, "EINVAL" },
. Poté jej můžete zabalit do pole:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
A v případě potřeby seřadit podle hodnoty errno za běhu. Pokud chcete být přenosní (do určité míry), zvažte, zda to nebude součástí procesu sestavení. Nebojte se, to je ten pravý unixový způsob, jak to udělat :)