Bagian kedua dari pertanyaan Anda dijawab oleh strerror
(seperti yang Anda tunjukkan), atau lebih baik strerror_r
, tetapi di glibc
setidaknya Anda cukup menggunakan %m
sebagai penentu format.
Bagian pertama lebih menarik, yaitu bagaimana Anda mendapatkan nama konstanta C untuk kesalahan tersebut. Saya yakin tidak ada cara untuk melakukannya dengan menggunakan glibc
standar . Anda dapat membuat larik statis atau tabel hash Anda sendiri untuk melakukannya dengan relatif mudah.
Sayangnya tidak; tidak ada dukungan introspeksi untuk E
makro kesalahan.
Anda dapat melakukan ini dengan mudah di Python:
import errno
print(errno.errorcode[errno.EPERM])
Ini karena pengelola Python mengalami kesulitan membuat tabel pencarian:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
Apa masalahnya?
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"'
Perintah shell unix ini mencetak E*
mendefinisikan dari /usr/include/sys/errno.h
(di mana aktual mendefinisikan hidup) dalam bentuk { EINVAL, "EINVAL" },
. Anda kemudian dapat membungkusnya menjadi sebuah array:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
Dan urutkan berdasarkan nilai errno saat runtime jika diperlukan. Jika Anda ingin portabel (sampai batas tertentu), pertimbangkan untuk menjadikan ini sebagai bagian dari proses pembuatan. Jangan khawatir, itulah cara unix yang sebenarnya untuk melakukan ini :)