在现代C++ Builder应用程序中使用预编译头文件的最佳实践是什么?

Dav*_*vid 23 c++builder precompiled-headers c++builder-xe4

我目前正在将一个大型RAD Studio 2010项目迁移到XE4.作为其中的一部分,我正在重新创建许多项目文件.我想借此机会确保我们使用最佳的预编译头文件机制,因为似乎有几种方法可以做到这一点.

现在我们只编译32位,但将来会使用64位编译器.

以下是我们目前在2010年所做的工作,以及为什么我不确定在XE4中要做什么:

在RAD Studio 2010中

我们有一个文件PchApp.h,其中包含<vcl.h>许多其他常用的头文件,主要是项目中各种常用核心类的头文件.此标头包含在每个CPP文件的顶部,后跟#pragma hdrstop如下所示:

// Top of .cpp file
#include "PchApp.h"
#pragma hdrstop

// Normal includes here
#include "other.h"
#include "other2.h"
// etc
Run Code Online (Sandbox Code Playgroud)

然后,我们在项目选项的预编译标题部分中进行以下设置:

当前RS2010预编译头设置

编译起来并不是特别快(大约350,000行代码需要12分钟.)我不确定:

  • "注入预编译头文件":这应该注入PchApp.h吗?
  • "缓存预编译头文件(必须与-H或-H"一起使用"xxx")": - H选项是"PCH文件名",因此我们正在使用它,但是预编译头的确定点是它"缓存"或每次编译预编译一次.这有什么额外的区别?
  • 我们应该在.cpp文件中包含两行包含PchApp.h和pragma hdrstop吗?有没有办法在项目选项中执行此操作,而不是在每个文件中复制这两行?他们有必要吗?

换句话说,我不确定这些是正确的还是最佳的设置,但是从阅读文档中我同样不确定什么会更好.我知道我不太了解所有选项 - 这个问题的一个原因:)

在RAD Studio XE4中

XE4 32位编译器的选项对话框是相同的,但有两件事让我感到困惑和/或让我不确定当前的2010方法是最好的.

1.默认行为

在创建新的VCL Forms项目时,IDE会创建一个默认名为Project1PCH1.h的标头,该标头旨在作为项目的预编译标头. 此标头包含<vcl.h><tchar.h>,并在项目管理器中显示为节点.它不包含在默认的Form1.cpp中,但#include <vcl.h>后面#pragma hdrstop是Form1.cpp的最顶层,后跟其他标题.

使用此标题的新项目的默认XE4设置对话框是: XE4默认预编译头设置

我(天真地?)正在假设默认值实际上是最佳/最佳设置.有些事情困扰我:

  • Project1PCH1.h在任何地方的预编译头设置中都没有提到项目的假定预编译头.
  • 标头不会被缓存
  • 未指定PCH文件名(这应该是Project1PCH1.h?)
  • .cpp文件也不包括Project1PCH1.h.

事实上,我不知道编译器或IDE实际上是如何知道它应该使用它Project1PCH1.h或者它应该使用它的.cpp文件,因为它没有以我能找到的任何方式引用.

这对我来说是最令人费解的事情,并且提出了这个问题,并清除了我对PCHes的困惑.我曾计划复制/使用IDE的默认设置,但在我明白他们在做什么之前我不想这样做.

2. PCH向导

自2010年以来,IDE已包含预编译头向导.我还没有能够让它工作 - 我现在再次运行它来获得它的结果并解释我对"不工作"的记忆,但它似乎需要几个小时,所以我将更新这个问题后来.

编辑:它运行,虽然它需要几个小时,并产生一个列表(对我来说,知道源基地)奇数标头.我几年前尝试它的回忆是它根本没有运行 - 一个明显的改进.

由于它存在,因此可能是在为升级2010项目而形成的新创建的项目文件中设置使用预编译头的最佳方法.我该如何做到最好?包括PchApp.h在内的所有.cpp文件都会混淆吗?

问题

以此为背景,我有以下问题:

  • 现有设置.我正在创建一个新的项目文件,并添加了数千个预先存在的.cpp文件,所有文件的顶部都带有"#include PchApp.h; #pragma hdrstop".我应该复制现有的RS2010 PCH设置吗?我应该删除上面两行并用其他东西替换它们吗?
  • 使用PCH向导:根据您的经验,这是否可以创建最佳设置?它是否包含文件,如果修改,将导致项目的大面积重建(可能不是编码的最佳)?是否可以在现有项目上使用,或者在使用之前需要删除像我们的"#include PchApp.h"这样的项目?
  • CPP文件/单位和正确的包含.使用预编译头文件的.cpp文件是否应包含预编译头文件本身,但只包含.cpp实际需要的头文件,即使PCH包含这些头文件?如果你有我们目前的情况,PchApp.h文件中包含几个常见的标题,那么.cpp文件实际上并不包含这些文件,那该怎么办?如果删除包含PchApp.h并将其替换为PchApp.h中特定.cpp文件所需的标头子集,它们是否应高于或低于#pragma hdrstop?(上面,我认为.)如果你在其中包含未包含在预编译头文件中的其他内容会怎么样 - 它会改变该特定单元的PCH使用情况,导致PCH重建(性能问题?)等等?
  • 默认设置:假设新项目的默认设置是最佳的,那么如何将当前系统迁移到使用它?
  • 非默认设置:如果默认设置不是最佳设置,那是什么?我想这是关键问题.
  • 32位和64位:知道我们将很快转向64位,我们应该怎样做才能让预编译的头在32位和64位上运行?如果所有PCH知识都在项目选项而不是.cpp文件中,那么32位和64位编译的不同设置是什么?

我正在寻求一个清晰,详细,解释性和指导性的答案,一个清楚地解释最佳实践,设置选项,包含在.cpp文件,标题和/或项目文件中的项目等等 - 换句话说,某些东西现在清理我(毕竟以上!)相当困惑的理解.今后其他C++ Builder用户可以将其作为首选PCH参考的高质量答案将非常出色.我打算在我能够的几天内增加一笔赏金.

str*_*nik 1

  1. 现有设置。根据我的经验,我通常会更改这些设置,因为如果您有数百个文件 - 它似乎并不是最佳选择。在 xCode 中,这是默认配置。编译性能不应该有差异。
  2. 使用 PCH 向导老实说,我从未在实际项目中使用过它,它也没有给我留下深刻的印象,所以只是忘记了这一点并使用了手动设置。
  3. CPP 文件/单元和正确的包含。不同的 IDE 有不同的默认设置。我平时用的就是:
    • 自动注入预编译头(.cpp 中无需手动 #include)
    • 首先包含与 .cpp 匹配的适当标头(如果存在)(myfile.cpp - 然后包含 myfile.h)
    • 之后包括执行特定工作的所有特定标头(特定的库标头等)
    • 在“myfile.h”中仅包含必须的内容。避免任何你能避免的事情。
    • 专门为特定 .cpp 文件包含的所有内容都应位于 #pragma hdrstop 下方。您想要预编译的所有内容都应该在上面。
  4. 默认设置我认为它不是最佳的。对我来说,只需更改设置中的几个选项,迁移就容易得多。
  5. 非默认设置正如我上面提到的 - 对我来说,最佳设置是自动注入预编译头。更多详细信息请参见第 3 项。
  6. 32 位和 64 位没有遇到任何问题。它应该为每个特定配置生成自己的预编译头。