2014-09-22 66 views
4

Accelerated C++: Practical Programming by Example书上说,下面..C++标准头文件

...系统头文件不需要被作为文件落实。即使将#include 指令是用来访问我们自己的头文件和系统头,有 不要求他们以同样的方式

这究竟意味着可以实现?如果不是作为一个文件系统头文件如何实现?

+0

实际上,这些确实是文件。原则上,编译器可以使用别的东西,例如访问一些数据库。今天大多数编译器(例如[GCC](http://gcc.gnu.org/))正在访问头文件。上个世纪的一些专有C++编译器使用了一个数据库。 – 2014-09-22 05:34:39

回答

3

头文件被包含到“源文件流”中的方式大部分都是实现。

C++ 11(但这已经很长一段时间的情况下,无论是在C++和C)16.2 Source file inclusion状态:

#include指示字应确定通过被处理的报头或源文件实施。

形式# include < h-char-sequence> new-line的预处理指令搜索的用于由<>定界符之间的指定序列唯一标识的报头实现定义的地方的序列,并且使得由标题的全部内容替换该指令的。如何指定位置或标识的是实现定义的。

(然后进一步描述"#include的裸体变体)。

因此标头可能在一个文件中。

它也可以由编译器从硬编码值中注入。或者从位于其中一个行星上的服务器读取参考星座(虽然没有FTL传输,这样的编译器在市场上不会持续太久)。

可能性是多种多样的,其中大多数与lunacy接近,但它们都没有被标准本身禁止。

5

编译器可能硬编码的,当它看到:

#include <iostream> 

那么它可以使被指定为通过该指令所声明的东西全部定义等

或者,它可以存储数据库中的定义,或其他编码文件,或云,或其他。关键是标准不会以任何方式限制编译器,只要最终目标达到指定的东西被声明。

6

想象一下,您编写自己的编译器和C++标准库。你可以这样做,以便#include <vector>不会打开任何文件,而只是将一些状态加载到编译器中,使其明白std::vector。然后,您可以使用C++以外的其他语言实现您的矢量类,只要您的编译器足够了解它的工作情况,就好像您已经编写了一个名为vector的实际C++源文件。