calc12 — 版本号统一、inf/nan 处理、步骤残留修复、POSIX 打包
1. 概述
本次迭代基于 suggestions.md 中的建议,修复了四项问题:
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。



