C 标准库 - <errno.h>

在C语言编程中,<errno.h> 头文件扮演着至关重要的角色,它提供了一个全局变量 errno 以及一系列预定义宏,用于指示系统调用或库函数执行过程中发生的错误。这些宏有助于程序员诊断和处理运行时错误。

errno 变量

extern int errno;

errno 是一个外部整型变量,它被C标准库中的特定函数设置为不同的非零值以指示不同类型的错误。当程序启动时,默认情况下其值被初始化为零。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
   
    char *large_number = "1e309"; // 尝试转换超过double最大值的字符串
    errno = 0; // 清零errno

    double result = strtod(large_number, NULL);

    if (errno == ERANGE) {
   
        perror("strtod failed: ");
        printf("The input number was too large for a double.\n");
    } else {
   
        printf("strtod succeeded with value: %f\n", result);
    }

    return 0;
}

在这里插入图片描述

在这个例子中,我们尝试将字符串 “1e309” 转换为 double 类型。由于这个数值超出了 double 类型的最大表示范围,理论上讲,在某些实现中,当调用 strtod 函数时,errno 应该会被设置为 ERANGE。这意味着转换过程中发生了范围错误,并且程序会打印出相应的错误信息。

错误代码宏

EDOM(Domain Error)

#define EDOM      33

当数学函数的输入参数超出了函数所定义的有效域时,例如计算对数函数 (log) 的负数参数,errno 将被设置为 EDOM

ERANGE(Range Error)

#define ERANGE    34

如果数学函数的结果超出所能表示的范围(如 strtod 解析出的数字太大无法存储),或者指定位移运算超过了类型的最大值,此时 errno 将被设置为 ERANGE

示例:

#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <syslimits.h>


int main() {
   
    errno = 0;
    double inf_result = log(-1.0); // 对于负数计算对数触发EDOM错误

    if (errno == EDOM) {
   
        perror("log function encountered domain error: ");
        // 输出可能为 "log function encountered domain error: Numerical argument out of domain"
    }

    errno = 0;
    long large_num = LONG_MAX;
    long overflow_result = large_num + 1; // 超出long类型最大值,触发ERANGE错误

    if (errno == ERANGE) {
   
        perror("Integer overflow occurred: ");
        // 输出可能为 "Integer overflow occurred: Result too large"
    }

    return 0;
}

在这里插入图片描述

通过检查并理解 errno 的值及其对应的错误宏,程序员能够更好地处理可能出现的异常情况,并确保程序的健壮性和可靠性。值得注意的是,每次读取 errno 前都应该先将其值保存下来,因为某些库函数可能会覆盖 errno 的值而并非总是错误发生的原因。此外,应当结合使用 perror() 函数来打印出与 errno 相关的错误信息。

相关推荐

  1. c++的标准

    2024-02-23 21:36:02       35 阅读
  2. C语言标准

    2024-02-23 21:36:02       39 阅读
  3. C++ 标准string

    2024-02-23 21:36:02       30 阅读
  4. C 标准 - <time.h>

    2024-02-23 21:36:02       54 阅读
  5. C 标准 - <string.h>

    2024-02-23 21:36:02       47 阅读
  6. c++ STL标准容器

    2024-02-23 21:36:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-23 21:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-23 21:36:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-23 21:36:02       82 阅读
  4. Python语言-面向对象

    2024-02-23 21:36:02       91 阅读

热门阅读

  1. 算法训练营day32,贪心算法6

    2024-02-23 21:36:02       63 阅读
  2. html开启严格模式

    2024-02-23 21:36:02       62 阅读
  3. MYSQL--触发器

    2024-02-23 21:36:02       57 阅读
  4. Linux(四)__用户和用户组管理

    2024-02-23 21:36:02       41 阅读
  5. C# 类型的默认值(C# 参考)

    2024-02-23 21:36:02       60 阅读
  6. 【leetcode热题】二叉树展开为链表

    2024-02-23 21:36:02       60 阅读
  7. 服务器丢包的原因及解决方法

    2024-02-23 21:36:02       69 阅读
  8. Oracle执行计划中字段后(+)的意思

    2024-02-23 21:36:02       50 阅读
  9. Flutter 中 Gap 和 SizedBox 的比较与区别

    2024-02-23 21:36:02       53 阅读
  10. 【Rust】——控制流(if-else,循环)

    2024-02-23 21:36:02       55 阅读