10

C 函数strerror返回错误描述字符串,详见此处。示例字符串

没有相应的文件和目录

问题是这些字符串在哪里定义?我浏览了我的头文件并没有看到任何东西。

4

4 回答 4

7

包含错误消息的头文件名为errmsg.h

00012 const char *const sys_errlist[] = {
00013         "Operation succeeded",        /* 0 */
00014         "Invalid argument",           /* EINVAL */
00015         "Bad memory address",         /* EFAULT */
00016         "String too long",            /* ENAMETOOLONG */
00017         "Out of memory",              /* ENOMEM */
00018         "Input/output error",         /* EIO */
00019         "No such file or directory",  /* ENOENT */
00020         "Not a directory",            /* ENOTDIR */
00021         "Is a directory",             /* EISDIR */
00022         "File or object exists",      /* EEXIST */
00023         "Cross-device link",          /* EXDEV */
00024         "Try again later",            /* EAGAIN */
00025         "Illegal seek",               /* ESPIPE */
00026         "Unimplemented feature",      /* EUNIMP */
00027         "Device not available",       /* ENXIO */
00028         "No such device",             /* ENODEV */
00029         "Device or resource busy",    /* EBUSY */
00030         "Invalid/inappropriate ioctl",/* EIOCTL (ENOTTY in Unix) */
00031         "Directory not empty",        /* ENOTEMPTY */
00032         "Result too large",           /* ERANGE */
00033         "No space left on device",    /* ENOSPC */
00034         "Too many open files",        /* EMFILE */
00035         "Too many open files in system",/* ENFILE */
00036         "No such system call",        /* ENOSYS */
00037         "File is not executable",     /* ENOEXEC */
00038         "Argument list too long",     /* E2BIG */
00039         "Bad file number",            /* EBADF */
00040 };

如您所见,它取决于 libc 实现。但总体思路是相同的:某个数组包含从错误号到最大长度为 1024 字节的字符串的映射。

其他实现:

于 2012-11-23T00:34:17.247 回答
6

它们被定义在 C 库中的某个地方,通常在一个char*名为sys_errlistlength的全局数组中sys_nerr,至少在 Unix 系统上是这样。

因为以前编写的遗留程序strerror是标准化的,可以直接访问这个数组,所以即使在现代 GNU/Linux 和 Mac OS X 上仍然可以使用它以实现向后兼容性(尽管你真的不应该通过perroror访问它strerror)。

例如,这是Mac OS X 10.8.2 对sys_errlist.

于 2012-11-23T00:31:33.917 回答
2

它们通常很可能被定义并嵌入到您的 C 运行时库中,例如大多数类 unix 系统上的 libc。

于 2012-11-23T00:26:23.220 回答
2

至少在一个典型的库中,它们将位于一个链接的目标文件中——通常是strerror.o(或.obj等)。如果你足够关心的话,稍微浏览一下库的源代码应该会打开它们。

于 2012-11-23T00:26:39.680 回答