HeadlinesBriefing HeadlinesBriefing.com

你的 C 不是标准 C

Hacker News •
×

这是一份不完整的清单,列出了标准中规定的 C 与实际中使用 glibc 或 musl 的 gcc 或 clang 用户所面对的 C 之间的不兼容之处。

默认情况下,gcc 和 clang 会将 asm 关键字识别为扩展。在标准 C 中,asm 是一个有效的非保留标识符,因此符合标准的代码在默认设置下可能无法编译。编译器默认并不符合标准,标准本可以像 C++ 那样将 asm 设为保留字,但它并未这样做。

标准要求 FLT_ROUNDS 反映通过 <fenv.h> 中的 fesetround 在运行时对舍入模式所做的更改。然而,无论运行时的舍入模式如何,gcc 始终将 FLT_ROUNDS 定义为 1(向最近舍入)。Clang 提供了内置函数 __builtin_flt_rounds(),但 gcc 没有。

C 标准规定了浮点 pragma(于 C99 和 C23 中加入),用于控制算术行为。在 C99 发布 27 年多之后,gcc 仍将所有这些 pragma 当作空操作忽略,而 clang 仅支持 C99 的 pragma。部分功能可以通过命令行选项实现,但这些选项作用于整个翻译单元,而不是单个函数或代码块。

标准要求函数返回类型中的限定符被丢弃。然而,clang 将其视为有意义的内容,因此同时声明 int f(); 和 const int f(); 会产生类型冲突错误,尽管这两个声明本应完全相同。

来源: Hacker News · 由HeadlinesBriefing整理摘要