包含标准库时不使用预编译头文件
Pre-compiled header is not used when including standard library
我正在尝试创建预编译头文件并在编译 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>
现在,当我尝试使用与以前相同的命令创建目标文件时,我得到了一长串文件(当然,其中大部分来自标准库)但是 none他们是 foo.hpp.gch。我确实在列表中看到 foo.hpp。
为什么会有所不同?
当头文件包含标准库时,如何在制作目标文件时使用预编译头文件?
应要求,这里是我的评论作为回答:
首先包含预编译头文件,然后是标准库。
这种行为可能是因为编译器无法知道未预编译的头文件(这里是标准库)是否发生了变化,例如一些影响预编译头并使其无效的宏定义。
(也许有人可以验证这一点,因为这只是一个猜测)
我正在尝试创建预编译头文件并在编译 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>
现在,当我尝试使用与以前相同的命令创建目标文件时,我得到了一长串文件(当然,其中大部分来自标准库)但是 none他们是 foo.hpp.gch。我确实在列表中看到 foo.hpp。
为什么会有所不同?
当头文件包含标准库时,如何在制作目标文件时使用预编译头文件?
应要求,这里是我的评论作为回答:
首先包含预编译头文件,然后是标准库。
这种行为可能是因为编译器无法知道未预编译的头文件(这里是标准库)是否发生了变化,例如一些影响预编译头并使其无效的宏定义。 (也许有人可以验证这一点,因为这只是一个猜测)