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

Soa*_*apy 3 c++ precompiled-headers

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

#include <iostream>
#include <string>
#include "boost_headers.hpp"
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*edl 5

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

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

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

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

  • 绝对.PCHs完全不可移植,对环境的微小变化很敏感. (5认同)