📜  C++中的errno常数(1)

📅  最后修改于: 2023-12-03 15:14:02.365000             🧑  作者: Mango

C++中的errno常量

在C++中,errno是一个整数类型的全局变量,用于表示最近一次发生的系统错误代码。errno被定义在头文件<errno.h>中,在C++11之后的标准中也可以通过头文件来使用errno。

errno通常用于与函数库函数一起使用,该函数会在遇到错误时将错误代码设置为errno。以下是一些常见的函数库函数和它们可能设置的errno值:

  • open():无法打开文件时设置errno为ENONET或ENOENT。
  • read():无法读取文件时设置errno为EBADF或EIO。
  • write():写入数据时出错时设置errno为EAGAIN或EPIPE。
  • fclose():无法正确关闭文件时设置errno为EBADF或EINTR。

以下是errno常量的完整列表:

| 常量名称 | 描述 | |--------|--------| | EDOM | 数学参数超出了其定义域 | | ERANGE | 结果超出了存储空间的范围 | | EACCES | 拒绝了对文件的访问 | | EAGAIN | 内核映像已满 | | EINTR | 执行被中断 | | EINVAL | 无效的参数 | | ENODEV | 没有这样的设备 | | ENOENT | 找不到文件或目录 | | ENOMEM | 没有足够的内存 | | ENOSYS | 函数不支持 | | EPERM | 操作不允许 |

可以通过给errno赋值为0来重置它,以便在函数之间使用。 如果errno没有设置过任何错误代码,则其值为0。有些函数在成功完成时不会清除errno值,因此在使用之前需要注意。

以下是一个示例程序,演示如何使用errno常量来检测函数调用是否失败:

#include <iostream>
#include <cerrno>
#include <cstdio>

int main()
{
   FILE *fp = fopen("non-existent-file.txt", "r");

   if(fp == NULL){
      std::cout << "Failed to open file: " << strerror(errno) << std::endl;
   }
   else{
      fclose(fp);
   }

   return 0;
}

在本例中,尝试打开一个不存在的文件时,fopen()将返回NULL并设置errno为ENOENT。程序使用strerror()函数将errno转换为人类可读的字符串,并将其输出到stdout。