为什么我的 stdbool.h 不在 /usr/include 中?

ein*_*lum 2 c gcc

我习惯了标准 C 头文件/usr/include(例如stdio.hstdlib.hstring.hctype.h);然而——stdbool.h不是。现在,我知道它比其他的更新,只是 C99 的一部分。但是 - 我确实有,就在

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdbool.h
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdbool.h
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdbool.h
Run Code Online (Sandbox Code Playgroud)

每个 GCC 版本都有不同的位置。这是为什么?毕竟,它是一个标准 - 它不应该从一个 GCC 版本更改为下一个版本。而且,果然,版本之间没有真正的差异。(*) 为什么这个是特定于编译器的,而其他是系统范围的?

* - 好吧,版权声明,以及一些基于 CPLUSPLUS 版本的 ifdef,用于与 C++ 一起使用时。

Jde*_*eBP 5

毕竟,它是一个标准 - 它不应该从一个 GCC 版本更改为下一个版本。

不,这不是标准。标准是你可以写

#include <stdbool.h>
在翻译单元中,它会影响某些事情。语言标准无法保证标头是文件,更不用说它们是计算机上文件系统中特定目录中具有固定内容的文件。

此类标准头的全部要点是,它们会执行适合 C/C++ 编译器的任何操作,以提供语言标准规定在包含时应提供的内容。它们(通常)使用编译器提供的内部关键字、编译指示、宏和内在函数来提供所需的声明和宏。当然,这因编译器而异。

这是您在这里犯的第二个错误。认为 GCC 是唯一的 C/C++ 编译器是一种短视的错误。具有较旧 DOS 或 Win32 编程背景的人(其中可能有许多编译器)将非常熟悉标准头与编译器密切相关的想法。人们不能仅仅从(例如)Watcom C/C++ 中获取标准头文件并将其与 Borland、Microsoft、IBM 或任何 C/C++ 编译器一起使用。

这就是要采用的想法,因为这对你来说也是如此。虽然为了实现其目的而需要在标准标头中完成的操作可能因 GCC 的一个版本而异,但在(例如)clang 和 GCC 之间可能有所不同。Unix 和 Linux 操作系统不是单一编译器。

事实上,您会发现float.hlimits.hstdint.hstddef.hstdarg.h和其他几个这样的标准头文件都驻留在这些编译器特定的位置。 limits.h这是一件特别混乱的事情,因为它既包含特定于编译器的知识,又包含特定于目标平台的知识。

进一步阅读

  • “4.1.2 标准标题”。 美国国家信息系统标准的基本原理 - 编程语言 - C
  • 比亚恩·斯特鲁斯特鲁普 (2013)。“标准库标题”。C++ 编程语言。第四版。艾迪生-韦斯利。国际标准书号 9780133522853。
  • 乔纳森·德博因·波拉德 (2012)。C/C++ 中的预定义宏可告诉您可用的语言功能。。经常给出的答案。