我有麻煩讓預編譯頭文件工作,所以我想出了以下最小工作示例。使用gcc預編譯頭文件的怪異行爲
這是頭文件foo.h
#include <iostream>
using namespace std;
void hello() {
cout << "Hello World" << endl;
}
我編譯這是g++ -c foo.h
給了我一個編譯頭foo.gch
。我期望當我編譯包含foo.h
的以下源文件時,它應該選擇標頭foo.h.gch
,我很好。
// test.cpp
#include <cstdio> // Swap ordering later
#include "foo.h" // ------------------
int main() {
hello();
}
但出乎意料的是,這並不編譯使用foo.h.gch
,而是使用foo.h
。爲了驗證你可以編譯以此爲g++ -H test.cpp
但是,如果我改變包含的頭文件的順序如下:
// test.cpp
#include "foo.h" // ------------------
#include <cstdio> // Ordering swapped
int main() {
hello();
}
現在,如果我編譯使用g++ -H test.cpp
,從foo.h.gch
編譯,噢!
所以我想知道這是否是GCC中的錯誤,或者我們是否應該使用預編譯的頭文件?在這兩種情況下,我認爲它有用知道..
在我的情況下,它似乎是超級有效的!我正在預編譯CGAL頭文件,並將編譯時間從18秒縮短到2秒。 – sud03r