c89标准中永远无法修复的歧义

An ambiguity in c89 which will never be fixed

我在c89标准中发现了一处模糊的措辞,导致gcc和clang对隐式函数声明的解释截然不同。c89允许调用未声明的函数时自动将其视为返回int的函数,但标准中关于“最内层块”的定义从未明确。当函数声明出现在参数列表中时,隐式声明究竟发生在块作用域还是函数原型作用域?这直接决定了代码是否合法。clang和gcc在此问题上各行其是,而由于该特性早在c99中被移除,我们永远无法得知标准制定者的本意。作者最后呼吁大家停止使用c89,毕竟c11标准已发布超过15年,除非你是在维护25年前破产公司的专有编译器,否则没有理由继续使用。

由于这个有问题的行为在标准中被移除已超过27年,我们永远无法确定其原本的解释意图。
  1. chasil

    我刚刚在 Linux 上重建了一个核心程序,它负责与我的 UNIVAC OS2200 CITA 和 VAX ACMS 通信。

    我最初将其构建为 32 位二进制文件,当时不得不使用 substr 函数来剔除一些噪声。

    在 Oracle Linux 上使用我的 MinGW 64 位 Windows 交叉编译器重建时,正是出于这个原因,我不得不从所有代码中挖掘出函数原型。

    “如果尝试调用一个不存在的函数,系统不会报错,而是隐式声明该函数为返回 int 且参数未指定的函数。”

    我不打算测试这个,因为那简直是痛苦。

    我会留下一个能正常构建的版本,然后在这个月退休。

    这段代码是由生者和逝者共同写就的,我的守护工作到此为止。我不羡慕那个必须测试这段代码的可怜人。

    当我自己挖掘它时,它已是一堆灰烬。

  2. bellowsgulch

    多年来我读到的关于 C 或 C++ 的所有奇怪行为,都可以总结为一句话:“呃……别那么做。”

    几乎无一例外。我甚至想不出你会如何陷入这种境地,因为编译器会在允许你使用未定义的隐式声明之前先报错。

  3. guenthert

    “因为这种有问题的行为在 27 多年前就被从标准中移除了,所以我们永远无法对原本的解释达成定论。”

    过时的标准结果被证明不够严格,午间新闻。

同日更多故事

2026-08-14