c++ - 包含标准库时不使用预编译头文件

标签 c++ g++ precompiled-headers

我正在尝试创建一个预编译头文件并在编译 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。
为什么会有所不同?
当头文件包含标准库时,如何在制作目标文件时使用预编译头文件?

最佳答案

根据要求,这里我的评论作为回答:

首先包含预编译头文件,然后包含标准库。

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

关于c++ - 包含标准库时不使用预编译头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39669033/

相关文章:

c++ - boost::random::variate_generator - 构造后更改参数

c++ - 使用 make_shared 初始化 const 成员

c++ - 为什么 ".exe"从相同的 c/c++ 源代码编译时比 ".out"大得多?

c++ - 预编译头文件中的错误 C2512?

c - 编译给定代码时 GCC 访问的文件

c++ - iOS预编译头文件包含<boost/shared_ptr.hpp>时出错

c++ - 这个表达有什么问题? "if (factorarray[x]%2 == 0 && factorarray[x]%3 ==0..."

c++ - 分支预测优化

c++ - 断言中的折叠表达式在某些机器上编译,但在其他机器上不编译

c++ - 如何获取传递给函数的数组的长度?