C89 里一个永远不会被修复的歧义:gcc 与 clang 的解读分歧
来源:sebsite.pw — 2026-08-10
📋 概述
作者在 C89/C90 标准里发现一处措辞歧义,gcc 与 clang 对隐式函数声明的解释互不一致。C89 有个'特性':调用不存在的函数时不会报错,而是被隐式声明为返回 int、参数未指定的函数;具体来说,调用表达式中未在作用域内的裸标识符会被插入为 extern int ()。这一特性在 C99 中被移除,因此这个歧义从未被澄清。文章从 `int f(int [sizeof(f())])` 这样的自引用声明出发,构建出 gcc 与 clang 分歧的有趣边界案例。
🔑 核心要点
- C89/C90 对隐式函数声明的措辞存在歧义,gcc 与 clang 解读不同。
- 调用未声明函数时,它被隐式声明为返回 int、参数未指定的函数。
- 看似多余的括号会影响语义:`f()` 插入 f,而 `(f)()` 不会——揭示了作用域插入的微妙时序。
- 由于该特性在 C99 被移除,这个歧义永远不会被澄清。
- 作者以 `int f(int [sizeof(f())])` 等自引用声明展示分歧边界。
💡 金句
标准里那些被时代淘汰的'特性',成了编译器永无定论的灰色地带。
👍 0
👎 0
← 返回 Lobsters 首页