Accelerated C++: Practical Programming by Example书上写着以下内容..
...系统头文件无需实现为文件。即使#include 指令用于访问我们自己的头文件和系统头文件 并不要求它们以相同的方式实施
这究竟是什么意思?如果不是文件,系统头文件怎么可以实现?
答案 0 :(得分:6)
想象一下,您编写自己的编译器和C ++标准库。您可以使#include <vector>
不打开任何文件,而只是将一些状态加载到编译器中,使其理解std::vector
。然后,您可以使用C ++以外的某种语言实现vector类,只要您的编译器足够理解它就能使其工作&#34;就好像&#34;你写了一个名为vector
的实际C ++源文件。
答案 1 :(得分:5)
编译器在看到时可以硬编码:
#include <iostream>
然后它提供指定为由该指令声明的事物的所有定义等。
或者它可以将定义存储在数据库,某些其他编码文件或云中,或其他任何内容中。关键是标准不以任何方式限制编译器,只要达到最终目标即可声明指定的事物。
答案 2 :(得分:3)
标题包含在“源文件流”中的方式主要由实现决定。
C ++ 11(但很长一段时间都是这种情况,无论是在C ++和C中)16.2 Source file inclusion
都说明了:
#include
指令应标识可由实现处理的头文件或源文件。
# include < h-char-sequence> new-line
形式的预处理指令搜索一系列实现定义的位置,以查找由<
和>
分隔符之间的指定序列唯一标识的标头,并导致替换该指令的标题的全部内容。如何指定场所或标识的标题是实现定义的。
(然后对"
的{{1}}和裸变体进行进一步描述。
因此标题可能位于文件中。
也可以由编译器从硬编码值中注入。
或者从位于Betelgeuse轨道上的一个行星上的服务器读取(但是,没有FTL传输,这样的编译器在市场上不会持续很久)。
可能性多种多样,大多数都与疯狂接壤,但实际上并没有被标准本身所禁止。