2016-09-23 108 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

按照要求,在这里我作为一个答案的评论:

先标准库包含了预编译的头。

这种行为很可能是因为编译器无法知道未预编译的头(这里是标准库)是否发生了变化,例如一些影响预编译头的宏定义并使其无效。因为它只是一个猜测