你的 C 不是标准 C
来源:sebsite.pw — 2026-10-12
📋 概述
作者整理了一份自认不完整的清单,罗列标准里的 C 与实际世界里的 C(gcc/clang 配 glibc/musl)之间的不兼容,开头引用 Dennis Ritchie 的话:委员会造出了一门没人能用也不会有人用的虚幻语言。清单包括:asm 在 gcc/clang 里默认被当作扩展关键字,而标准 C 里它是合法的非保留标识符,所以合规代码可能编译不过,标准也没像 C++ 那样把它列为保留字;标准要求 FLT_ROUNDS 反映运行时的浮点舍入模式,gcc 却永远定义为 1;C99 起的五个标准 pragma 在 gcc 里 27 年过去仍是空操作;glibc 的 initstate 出错时不按 POSIX 要求返回 NULL;clang 把函数返回类型上的限定符当作有意义,与标准相抵触;musl 提供的 va_start 定义过时,导致 C23 允许省略第二参数的新用法在 musl 上不能用。
🔑 核心要点
- asm 在 gcc/clang 默认被当作扩展关键字,而标准 C 里它是合法的非保留标识符,合规代码可能因此编译不过
- 标准要求 FLT_ROUNDS 反映运行时舍入模式,gcc 却无条件把它定义为 1
- C99 以来的五个标准 pragma 在 gcc 里至今仍是空操作,C23 新增的两个 clang 也还不支持
- 命令行开关作用于整个翻译单元,而pragma 本可以只作用于单个函数或代码块
- glibc 的 initstate 出错时不返回 NULL,与 POSIX 要求相抵触,手册只在 BUGS 一节承认
- clang 把函数返回类型上的限定符当作有意义(int f(); 与 const int f(); 被判为冲突),而标准要求丢弃它们
💡 金句
委员会造出了一门没有人能用、也不会有人去用的虚幻语言。
👍 0
👎 0
← 返回 Lobsters 首页