c - C 标准库中的头文件可以包含另一个头文件吗?

标签 c include language-lawyer c-standard-library

我依稀记得一条规则“C 标准库的头文件不得包含 C 标准库的任何其他头文件,除非特别允许”。但奇怪的是,我在 C11 中找不到这样的规则。我本来希望它出现在 7.1.2“标准标题”中。

  • C中有这样的规则吗?
  • POSIX中有这样的规则吗?
  • 其他标准中是否有这样的规则?

最佳答案

搜索从 Ansi-C (C90) 到最新草案的 C 标准,并进一步浏览历史引用资料,例如 Unix V7 手册和 K&R 书籍,我找不到该规则的引用资料。

标准头文件的内容、位置和实现是特定于实现的,一些类型和宏定义在多个头文件中,因此需要一个一致的方案来避免重新定义警告,并且在常见的 C 库实现中通过条件包含来实现。

某些系统 header 被明确指定为包括其他 header :

7.25 Type-generic math <tgmath.h>

The header <tgmath.h> includes the headers <math.h> and <complex.h> and defines several type-generic macros.

7.26 Threads <threads.h>
7.26.1 Introduction
The header <threads.h> includes the header <time.h>, defines macros, and declares types, enumeration constants, and functions that support multiple threads of execution.

一些标准 POSIX header 也被记录为包括其他系统 header 。

除非程序员正在实现 C 库,否则该规则不会有任何区别:记录为定义标准类型、枚举常量、宏、函数或变量的系统头文件应在使用此标识符之前包含。系统 header 可以按任意顺序包含,多次包含应该不会造成任何问题。

关于c - C 标准库中的头文件可以包含另一个头文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65868752/

相关文章:

c - 获得 ALSA 支持的最大采样频率

c - 使用 Typedef 在 C 中进行数组初始化

c++ - 通过 C 中的辅助矩阵求解线性方程组

c++ - 循环包含,我如何在不改变类层次结构的情况下解决这个问题

c++ - 不完整类型适用于 gcc,但不适用于 clang 和 msvc

c++ - 进程引用初始化时是否是clang中的错误

CBMC 在我的 Pthreads 程序中检测到断言错误,是否正确?

Node.js 使用外部 JS 文件?

c++ - 使用 C++ 创建 MAPI 配置文件

c++ - 为什么 typedef 模板是非法的?