• C 标准库 - <errno.h>


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

    errno 变量

    extern int errno;
    
    • 1

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

    示例:

    #include 
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

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

    错误代码宏

    EDOM(Domain Error)

    #define EDOM      33
    
    • 1

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

    ERANGE(Range Error)

    #define ERANGE    34
    
    • 1

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

    示例:

    #include 
    #include 
    #include 
    #include 
    
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

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

  • 相关阅读:
    JavaWeb搭建学生管理系统(手把手)
    【CSDN竞赛】第十一期解题报告
    linux入门---信号的操作
    Milvus向量数据库:高效处理海量非结构化数据的利器
    算法与数据结构 学习笔记2
    双十一大促客服必备话术
    Android12修改设备名称
    mesos+marathon平台搭建
    2022全国大学生数学建模A题的思路与解法
    Leetcode154. 寻找旋转排序数组中的最小值(存在重复元素)
  • 原文地址:https://blog.csdn.net/qq_29752857/article/details/136234376