预编译 headers 和正常包含

Precompiled headers and normal includes

当使用预编译的 headers 时,如果我包含一个 header,我已经包含在预编译的 header 中,它是否会有所不同(或产生不良影响) , 也是常规 header?

或者换句话说:当我在另一个 header 文件中包含一个 header x 并且同时在我的预编译 header 文件中包含 x 时,这是否会阻止优化由预编译提供 header 踢?

没有

(一般)。将要发生的是,在编译期间,如果您使用预编译的 headers,并且编译器发现预编译形式中已经存在的 header,它将选择使用预编译形式.

事实上,继续使用您的包含是一种很好的做法,就好像您一开始就没有预编译过 header 一样。这有助于您将来关闭预编译的 headers 或修改其中的 headers 列表,或者其他人决定进行他们自己的 out-of-source 构建但不使用PCH.

预编译 header 是 compile-time 优化。代码必须像没有预编译的 header 一样编写。可以使用编译器的参数完全添加对这些 header 的支持,即通过调整构建过程并添加 "catch-all" header 如果构建系统无法为你(现在真的应该这样做!)。

TL;DR:预编译 headers 是您在构建脚本中设置的开关。而已。它们不应泄漏到构建脚本之外。