C函数strerror
返回一个错误描述string,详见这里 。 示例string
无此文件或目录
问题是这些string在哪里定义? 我查看了我的头文件,没有看到任何东西。
它们是在C库中的某个地方定义的,传统上是在全局的char*
长度sys_nerr
,至少在Unix系统上是sys_errlist
。
因为在strerror
之前编写的传统程序可以直接访问这个数组,所以即使在现代的GNU / Linux和Mac OS X上它仍然可用,以便向后兼容(尽管除了通过perror
或strerror
之外,你真的不应该访问它)。
例如,这里是sys_errlist
的Mac OS X 10.8.2定义 。
包含错误消息的头文件被命名为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字节的字符串最大长度的映射。
其他实现:
它们通常可能被定义并嵌入到C运行时库中,例如大多数Unix系统上的libc。
至少在一个典型的库中,它们将在一个被链接的目标文件中 – 通常是strerror.o
(或.obj
等)。 如果你足够关心的话,通过源代码对图书馆的一些小问题应该把它们打开。