あなたの質問の 2 番目の部分は strerror
によって回答されます (あなたが指摘するように)、またはそれ以上の strerror_r
、しかし glibc
少なくとも、単純に %m
を使用できます フォーマット指定子として。
最初の部分はより興味深いものです。つまり、エラーの C 定数の名前を取得する方法です。標準の glibc
を使用してそれを行う方法はないと思います .独自の静的配列またはハッシュ テーブルを作成して、これを比較的簡単に行うことができます。
残念ながら違います; E
のイントロスペクション サポートはありません エラー マクロ。
これは Python で簡単に行うことができます:
import errno
print(errno.errorcode[errno.EPERM])
これは、Python の保守担当者がルックアップ テーブルの生成に苦労したためです:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
何が問題ですか?
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"'
この UNIX シェル コマンドは E*
を出力します。 /usr/include/sys/errno.h
から定義 { EINVAL, "EINVAL" },
の形式で (実際の定義が生きている場所) .その後、配列にラップすることができます:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
必要に応じて、実行時に errno 値でソートします。 (ある程度) 移植可能にしたい場合は、これをビルド プロセスの一部にすることを検討してください。心配しないでください。これが本当の UNIX のやり方です :)