Der zweite Teil Ihrer Frage wird von strerror
beantwortet (wie Sie darauf hinweisen), oder besser strerror_r
, aber in glibc
zumindest können Sie einfach %m
verwenden als Formatbezeichner.
Interessanter ist der erste Teil, d.h. wie bekommt man den Namen der C-Konstante für den Fehler. Ich glaube, es gibt keine Möglichkeit, dies mit Standard glibc
zu tun . Sie könnten Ihr eigenes statisches Array oder Ihre eigene Hash-Tabelle erstellen, um dies relativ einfach zu tun.
Leider nicht; es gibt keine Selbstbeobachtungsunterstützung für E
Fehlermakros.
Sie können dies trivial in Python tun:
import errno
print(errno.errorcode[errno.EPERM])
Das liegt daran, dass sich die Python-Maintainer die Mühe gemacht haben, eine Lookup-Tabelle zu generieren:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
Was ist das Problem?
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"'
Dieser Unix-Shell-Befehl gibt E*
aus definiert ab /usr/include/sys/errno.h
(wobei „actual“ live definiert) in der Form { EINVAL, "EINVAL" },
. Sie können es dann in ein Array packen:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
Und bei Bedarf zur Laufzeit nach Errno-Wert sortieren. Wenn Sie (bis zu einem gewissen Grad) portabel sein möchten, sollten Sie dies zu einem Teil des Build-Prozesses machen. Keine Sorge, das ist die wahre Unix-Methode :)