欢迎光临
我们一直在努力

AI开发C语言应用按步走,表达式计算器calc的第十二步,版本号统一、inf/nan 处理、步骤残留修复、POSIX 打包

calc12 — 版本号统一、inf/nan 处理、步骤残留修复、POSIX 打包

1. 概述

本次迭代基于 suggestions.md 中的建议,修复了四项问题:

  • 版本号统一 — 消除 main.c 与 Makefile 中的重复定义
  • inf / nan 处理 — 浮点运算溢出或无效时输出友好提示
  • 步骤残留修复 — 批处理模式不再受 print_steps 跨调用残留影响
  • POSIX 打包 — dist 目标改用 tar 替代 cp –parents,兼容 BSD/macOS
  • 2. 变更清单

    文件改动说明
    Makefile CFLAGS 追加 -DVERSION=\\"$(VERSION)\\";dist 目标改用 tar 管道 版本号统一;POSIX 兼容
    main.c 删除 #define VERSION "1.0";parse_and_eval 开头加 eval_set_print_steps(0) 版本号不再重复;批处理不再残留步骤
    eval.c eval_expr 返回前添加 isinf / isnan 检查 溢出/NaN 时返回 1 并输出提示
    test.expr 新增 1e308*1e308 和 0/0 两个错误用例 覆盖 inf/nan 检查路径

    3. 版本号统一

    3.1 改造前

    # Makefile
    VERSION = 1.0

    // main.c
    #define VERSION "1.0"

    两个文件各自定义,修改时可能不同步。

    3.2 改造后

    Makefile 作为单一来源,通过 -D 编译参数传入 C 代码:

    # Makefile
    CFLAGS = -Wall -Wextra -std=c99 -pedantic -g -O2 -DVERSION=\\"$(VERSION)\\"
    VERSION = 1.0

    // main.c — 删除 #define VERSION 行,直接使用编译传入的宏

    make 编译时自动展开为 -DVERSION=\\"1.0\\",main.c 中的 VERSION 宏由编译器自动定义。

    4. inf / nan 处理

    4.1 改造前

    1e308 * 1e308 产生 inf,0.0 / 0.0 产生 nan,均无提示直接输出。

    4.2 改造后

    在 eval_expr 返回前添加检查:

    if (isinf(val)) {
    fprintf(stderr, " error: result overflow\\n");
    return 1;
    }
    if (isnan(val)) {
    fprintf(stderr, " error: result is not a number\\n");
    return 1;
    }

    4.3 验证

    $ ./build/calc "1e308*1e308"
    error: result overflow

    $ ./build/calc "0/0"
    error: result is not a number

    5. 步骤残留修复

    5.1 改造前

    parse_and_eval 不重置 print_steps。若用户在 REPL 模式中先进入交互(print_steps = 1),退出后使用批处理,可能误输出运算步骤。

    5.2 改造后

    在 parse_and_eval 入口显式关闭步骤打印:

    static int parse_and_eval(const char *input)
    {
    eval_set_print_steps(0);
    // …
    }

    6. POSIX 打包

    6.1 改造前

    dist:
    cp -r –parents $(SRC) $(HDR) Makefile $(TESTFILE) doc/ $(PKG_NAME)/

    cp –parents 是 GNU coreutils 扩展,在 BSD/macOS 上不可用。

    6.2 改造后

    dist:
    tar cf – $(SRC) $(HDR) Makefile $(TESTFILE) doc/ | tar xf – -C $(PKG_NAME)

    利用 tar 管道:先创建归档写入 stdout,再通过管道解压到目标目录。tar 是 POSIX 标准工具,跨平台兼容。

    7. 测试验证

    $ make test
    ============================================
    calc — 测试套件
    ============================================
    PASS [ 1] (90-18)/3+15 → 39
    ...
    PASS [30] 1e308*1e308 → error
    PASS [31] 0/0 → error
    ============================================
    31 passed, 0 failed, 31 total
    ============================================

    测试用例从 29 增至 31,新增 2 个覆盖 inf/nan 错误路径的用例。

    $ make dist
    created calc-1.0.tar.gz

    dist 成功生成归档,tar xf – -C 方式兼容 Linux / BSD / macOS。

    赞(0)
    未经允许不得转载:171主机测评 » AI开发C语言应用按步走,表达式计算器calc的第十二步,版本号统一、inf/nan 处理、步骤残留修复、POSIX 打包
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址