C语言错误处理宏两个比较重要的

核心总结:两个宏的定位

这两个都是 C 语言中用于提升程序健壮性的自定义宏,分别解决「命令行参数合法性检查」和「函数返回值错误检查」问题,是 Linux/C 编程中常见的错误处理范式。

宏名 核心功能 适用场景
ARGS_CHECK 检查命令行参数个数是否符合预期 程序启动时验证参数数量
ERROR_CHECK 检查函数返回值是否为错误标记,打印系统错误 调用系统 / 库函数后验证执行结果

二、逐宏拆解(语法 + 细节)

1. ARGS_CHECK:命令行参数个数检查宏
cpp 复制代码
#define ARGS_CHECK(argc, expected) \
    do { \
        if ((argc) != (expected)) { \
            fprintf(stderr, "args num error!\n"); \
            exit(1); \
        } \
    } while (0)
关键知识点:
  • 参数说明
    • argc:程序实际接收的命令行参数总数(C 语言中main(int argc, char *argv[])的第一个参数,程序名本身算 1 个参数);
    • expected:程序期望的参数个数(比如仅执行程序./a.out时,期望argc=1)。
  • 核心逻辑 :若实际参数数 ≠ 期望参数数,通过fprintf(stderr)输出错误提示(stderr保证错误信息直接显示在控制台,不被重定向覆盖),并调用exit(1)终止程序(1表示异常退出,区别于正常退出的exit(0))。
  • 语法细节 :用do { ... } while (0)包裹逻辑:保证宏在任何场景下(比如单独使用、跟在if后)语法正确,避免因宏展开导致的语句块错误(比如少加花括号引发的逻辑混乱)。
典型使用示例
cpp 复制代码
int main(int argc, char *argv[]) {
    // 期望程序仅接收1个参数(仅程序名),否则报错
    ARGS_CHECK(argc, 1); 
    // 后续业务逻辑...
    return 0;
}
2. ERROR_CHECK:函数返回值错误检查宏
cpp 复制代码
#define ERROR_CHECK(ret, error_flag, msg) \
    do { \
        if ((ret) == (error_flag)) { \
            perror(msg); \
            exit(1); \
        } \
    } while (0)
关键知识点:
  • 参数说明
    • ret:函数调用后的实际返回值(比如open/read/malloc的返回值);
    • error_flag:函数的错误标记值(比如open失败返回-1malloc失败返回NULL);
    • msg:自定义错误提示文本(用于说明 "哪个操作出错")。
  • 核心逻辑 :若函数返回值等于错误标记,调用perror(msg)打印错误(perror会输出「自定义 msg + 系统级错误原因」,比如msg="open file"时,输出open file: No such file or directory),并exit(1)终止程序。
  • 关键区别perrorfprintf(stderr) 更强大 ------ 不仅输出自定义提示,还会结合errno(系统错误码)输出具体的系统错误原因,适合排查函数执行失败的底层原因。
相关推荐
liangsheng_g27 分钟前
SpringAOP拦截器链递归与事务钩子补偿源码实战
java·spring
SL_staff32 分钟前
制造业私有化文档平台的技术实践:从知识孤岛到可追溯知识资产
java·spring·开源
小哈里42 分钟前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军1 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司2 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
H_oRIZoN_2 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
SL_staff2 小时前
3天上线OKR系统:一名HR与1名工程师如何用JVS完成全栈交付
java·低代码·开源
a187927218312 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记2 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
Navigator_Z3 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode