【问题标题】:Can a C implementation implicitly include standard headers when including a different header?当包含不同的标头时,C 实现是否可以隐式包含标准标头?
【发布时间】:2023-11-05 20:43:01
【问题描述】:

在阅读Is this proper C declaration? If so, why does it not work?时我在想

#include <stdio.h>

int main(void) {
  int bool = 0;
  return bool == 0;
}

这个程序是否严格遵守?换句话说,是允许stdio.h 包含stdbool.h 还是禁止这样做?这是规范规定的吗?

【问题讨论】:

    标签: c header c99


    【解决方案1】:

    我不确定它是否具有任何权威性,但这是 Plauger 所说的(当然它是针对 c89 的)。

    标准 C 库提供 15 个标准头文件。标头 有几个属性

    它们是相互独立的。没有标准标题要求 首先包含另一个标准标题,以使其正常工作。 任何标准标头也不包含另一个标准标头

    我在 c99 或 c89 中找不到任何提及。

    编辑

    我可以看到inttypes.h 包括stdint.h

    7.8-1

    标头&lt;inttypes.h&gt; 包含标头&lt;stdint.h&gt; 并对其进行扩展 由托管实现提供的额外设施。

    【讨论】:

      【解决方案2】:

      C 标准头文件不能包含其他头文件。这与明确允许的 C++ 不同。

      C99 标准,第 7.1.3 节

      每个标头声明或定义其相关子条款中列出的所有标识符[...] 没有保留其他标识符。

      【讨论】:

      • 虽然我相信你,你能给我们一些参考(例如,K&R)吗?
      • 嗯,如果一个标题包含另一个标题,那么我的程序实际上包含两个标题。然后似乎保留了两个标头的标识符。还是因为没有明确的规则允许,所以包含另一个标头是非法的?
      • @Johannes - 据我了解,这个想法是某个标题只能包含指定的名称和通常保留的名称(即 [...])。如果你想定义bool,你应该包括。否则它只是_Bool,您可以像在您的示例中一样使用 bool。
      最近更新 更多