字符串转浮点:标准 C 里无法移植地检查转换错误
来源:sebsite.pw — 2026-10-09
📋 概述
作者延续上一篇关于 math_errhandling 的讨论,指出 strtod 等字符串转浮点函数同样受该宏影响,却不在 math.h 里:当实现不声明支持 errno(如 musl)时,溢出不会写入 errno;下溢是否报错更是完全由实现自定。POSIX 则要求溢出与下溢一律设置 errno = ERANGE,与标准 C 的措辞存在冲突。文章给出一份"如何正确检查错误"的清单,并认为标准在这里需要更明确的措辞。
🔑 核心要点
- strtod/strtof/strtold 等受 math_errhandling 影响却不在 math.h 中
- 若实现不声明 MATH_ERRNO(如 musl),溢出时不写 errno
- 下溢是否报错完全是实现自定义,标准不作要求
- POSIX 要求溢出/下溢一律设 errno = ERANGE,与标准 C 的措辞存在冲突
- 输入非法(无转换)时只能靠 endptr == nptr 判断,errno 不可依赖
- 同为 POSIX 兼容实现行为却不同:glibc 不设 EINVAL,musl 会设
💡 金句
errno 在这些函数的描述里是被明确文档化的,而那段描述并未提及当 math_errhandling & MATH_ERRNO 为 0 时要设置 errno。这就暗示 POSIX 的行为并不符合标准。
👍 0
👎 0
← 返回 Lobsters 首页