打印errno作为助记符?

我已经看到符号errnostring – 堆栈溢出 ,所以即使这个问题是bash相关的,我已经可以告诉这不是微不足道的; 但只是为了确认:

是否有一个C API函数,像strerror()将接受数字errno作为参数 – 但将打印助记符(如EINVAL ),而不是错误描述string(如“无效参数”)?

作为一个例子,我想

 printf("Number: %d (%s): '%s'\n", 22, strerror_mnemonic(22), strerror(22) ); 

… 打印:

 Number: 22 (EINVAL): 'Invalid argument' 

strerror_mnemonic是我正在寻找C函数的伪代码。

不幸的是, E错误宏没有反省支持。

你可以在Python中轻松地做到这一点:

 import errno print(errno.errorcode[errno.EPERM]) 

这是因为Python维护者遇到了生成查找表的麻烦: http : //hg.python.org/cpython/file/tip/modulees/errnomodule.c

你的问题的第二部分是由strerror (正如你指出的那样)或更好的strerror_r来回答的,但是在glibc中至少可以简单地使用%m作为格式说明符。

第一部分是更有趣的,即你如何得到错误的C常数的名称。 我相信有没有办法使用标准的glibc做到这一点。 你可以构造你自己的静态数组或哈希表来做到这一点相对容易。

你想strerror(3) 。 (3)你有时可能会感兴趣。 顺便说一句, 错误(3)手册页提到他们。

您可能不需要显示EINVAL助记符(除非您关心C代码生成)。 如果你这样做,做一个函数(本质上,一个switch语句)。

有什么问题?

 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 shell命令打印出来的E*/usr/include/sys/errno.h (其中实际定义的实体)的格式{ EINVAL, "EINVAL" }, 。 然后你可以把它包装成一个数组:

 struct errno_str_t { int code; const char *str; } errnos[] = { { EINVAL, "EINVAL" }, ... }; 

如果需要,可以在运行时通过errno值进行排序。 如果你想要移植(在某种程度上),可以考虑将其作为构建过程的一部分。 不要担心,这是这样做的真正unix方式:)