预编译头可以像库一样使用吗?

时间:2015-02-24 10:50:18

标签: c++ precompiled-headers

是否可以使用像编译库一样的预编译头?例如,我可以创建一个包含预处理器的头,如下所示:

#include <iostream>
#include <string>
#include "boost_headers.hpp"

将其编译成PCH然后分发PCH而不必分发用于创建它的头文件?

2 个答案:

答案 0 :(得分:5)

没有。预编译头文件有多个方面,使它们不适合作为分发格式。

  • 他们不稳定。对编译器或构建设置的任何更改都会使预编译的头文件无效。
  • 他们不是模块化的。 PCH必须是源文件(甚至通过命令行)中包含的第一件事。作为必然结果,您不能包含多个PCH。换句话说,如果您将图书馆作为PCH分发,那么您基本上就是说您的图书馆是用户唯一需要的图书馆。

问题是PCH通常(在MSVC和GCC中,Clang略有不同)实现为内部编译器状态的简单转储。加载PCH意味着用PCH中的状态替换编译器状态。没有中间立场 - 编制者无法将PCH的状态合并到当前状态。

Clang的PCH实现方式不同,但仍然必须是第一件事,因为如果PCH之前有任何事情,C ++编译模型仍然意味着PCH可能无效。 Clang的模块支持基本上描述了一个允许合并PCH的改变的编译模型。 (正确地进行合并还涉及很多工作。)

答案 1 :(得分:3)

没有。预编译头只能由创建它们的编译器使用。对于GCC来说,它甚至可以使用相同的二进制文件。