预编译 Headers 可以像库一样使用吗?
Can Precompiled Headers Be Used Like Libraries?
是否可以像使用库一样使用预编译Headers?例如,我可以创建一个 header 包含这样的预处理器:
#include <iostream>
#include <string>
#include "boost_headers.hpp"
将其编译成 PCH,然后分发 PCH 而无需分发用于创建它的 headers 文件?
没有。预编译 headers 只能由创建它们的编译器使用。对于 GCC,它甚至意味着相同的二进制文件。
没有。预编译 headers 有多个方面使它们不适合作为分发格式。
- 它们不稳定。对编译器或构建设置的任何更改都会使预编译无效 headers.
- 它们不是模块化的。 PCH 必须是从源文件(甚至通过命令行)包含的第一件事。作为推论,您不能包含多个 PCH。换句话说,如果您将您的库作为 PCH 分发,您基本上是在说您的库是用户唯一需要的东西。
问题是 PCH 通常(在 MSVC 和 GCC 中,Clang 略有不同)实现为内部编译器状态的简单转储。加载 PCH 意味着用 PCH 中的状态替换编译器状态。没有中间地带 - 编译器无法将 PCH 中的状态合并到它们的当前状态中。
Clang 的 PCH 实现方式不同,但仍然必须是第一件事,因为如果在 PCH 之前出现任何东西,C++ 编译模型仍然意味着 PCH 可能无效。 Clang 的模块支持基本上描述了一种允许合并 PCH 的更改编译模型。 (正确合并还涉及很多工作。)
是否可以像使用库一样使用预编译Headers?例如,我可以创建一个 header 包含这样的预处理器:
#include <iostream>
#include <string>
#include "boost_headers.hpp"
将其编译成 PCH,然后分发 PCH 而无需分发用于创建它的 headers 文件?
没有。预编译 headers 只能由创建它们的编译器使用。对于 GCC,它甚至意味着相同的二进制文件。
没有。预编译 headers 有多个方面使它们不适合作为分发格式。
- 它们不稳定。对编译器或构建设置的任何更改都会使预编译无效 headers.
- 它们不是模块化的。 PCH 必须是从源文件(甚至通过命令行)包含的第一件事。作为推论,您不能包含多个 PCH。换句话说,如果您将您的库作为 PCH 分发,您基本上是在说您的库是用户唯一需要的东西。
问题是 PCH 通常(在 MSVC 和 GCC 中,Clang 略有不同)实现为内部编译器状态的简单转储。加载 PCH 意味着用 PCH 中的状态替换编译器状态。没有中间地带 - 编译器无法将 PCH 中的状态合并到它们的当前状态中。
Clang 的 PCH 实现方式不同,但仍然必须是第一件事,因为如果在 PCH 之前出现任何东西,C++ 编译模型仍然意味着 PCH 可能无效。 Clang 的模块支持基本上描述了一种允许合并 PCH 的更改编译模型。 (正确合并还涉及很多工作。)