2016-09-23 61 views
1

我正嘗試創建預編譯頭文件並在編譯cpp文件時使用它。我有2個下列文件:
main.cpp中:包括標準庫時未使用預編譯頭文件

#include "foo.hpp" 

int main() 
{ 
    myTemplate<int> obj; 

    return 0; 
} 

和foo.hpp:

#ifndef FOO_HPP 
#define FOO_HPP 

template<class T> 
class myTemplate 
{ 
}; 

#endif 

我運行這個命令來創建一個GCH文件

g++ -std=c++11 foo.hpp 

然後我製作目標文件,使用-H標誌查看正在使用哪些文件

g++ -std=c++11 -H -c main.cpp 

和輸出

! foo.hpp.gch 
main.cpp 

好。正在使用gch文件。

現在我在main.cpp中

#include <iostream> 

的開始,因爲之前插入這條線現在,當我試圖創建對象文件,使用相同的命令,我得到的文件的長列表(他們中的大多數都來自標準庫當然),但他們都不是foo.hpp.gch。我在列表中看到foo.hpp。
爲什麼它有所作爲?
如何在製作目標文件時使用預編譯的標題,而標題包含標準庫?

+1

我不知道熱gcc處理這個問題,但我記得MSVC後面的某個地方,我記得,預編譯頭通常首先放在一個文件中。這是有道理的,因爲其他包含的標題可能會改變,例如宏定義會影響您的頭文件並使預編譯版本無效。那麼你是否試圖包含第一個「foo.hpp」,然後是? – Anedar

+0

@Anedar解決了這個問題。謝謝。我想你應該發表你的評論作爲答案,以獲得信貸。 – Jona

回答

1

按照要求,在這裏我作爲一個答案的評論:

先標準庫包含了預編譯的頭。

這種行爲很可能是因爲編譯器無法知道未預編譯的頭(這裏是標準庫)是否發生了變化,例如一些影響預編譯頭的宏定義並使其無效。因爲它只是一個猜測