将“ENOTDIR”,“EBUSY”等作为字符串返回的函数?

时间:2016-09-14 00:06:08

标签: c error-handling runtime-error

strerror()函数返回一个简短的错误描述,给出错误号作为参数。例如,如果参数是ENOTDIR,它将返回“Not a directory”,如果参数是EBUSY,它将返回“Device or resource busy”等。

但是,是否有一个函数返回“ENOTDIR”参数等于ENOTDIR,“EBUSY”返回参数EBUSY等?

我只是想避免为此目的编写一个巨大的switch语句。

2 个答案:

答案 0 :(得分:3)

否 - 没有提供此功能的标准或常用非标准功能。

一种方法是编写一个巨大的switch语句,但这可能不是你采取的最佳方法。 errno的大多数值都没有被任何标准指定,因此它们的值在不同操作系统甚至同一操作系统的不同版本之间可能会也可能不一致。

另外,后端会很痛苦。

如果可以接受某些运行时开销,那么更优雅的方法是编写一个函数,在这些错误代码出现时查找这些错误代码,而不是将值硬编码到一个大表中。 GNU / Linux系统列出了所有可能的errno值:

/usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h

这些文件提供#define每个errno值以及它们的值和相邻注释中的简短描述。逐行搜索这些文件并打印出匹配的错误代码非常简单。即使没有,这些文件也是你编写一个巨大的switch语句的开始。

请注意,当内核传递给用户空间时,内核可能会否定这些值。

答案 1 :(得分:2)

正如David指出的那样,问题是没有可以提供所需功能的标准功能。因此,考虑到尝试编写脚本会是一个很好的问题,我写了一些东西来自动生成切换函数(如果它应该是必要的)并发布代码here。似乎在OS X上工作正常,否则里程可能会有所不同。可以将诸如此类的脚本添加到构建过程中,以确保正确定义了值。