2014-09-22 45 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++源文件。