gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:30:07 28 4
gpt4 key购买 nike

我目前正在将一个大型 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

然后我们在项目选项的 Precompiled Headers 部分有以下设置:

Current RS2010 precompiled header settings

编译速度不是特别快(大约 350,000 行代码需要 12 分钟。)我不确定:
  • “注入(inject)预编译头文件”:这应该注入(inject) PchApp.h 吗?
  • “缓存预编译头文件(必须与 -H 或 -H“xxx”一起使用)”:-H 选项是“PCH 文件名”,所以我们正在使用它,但预编译头文件的重点在于它是“缓存”或每次编译预构建一次。这有什么额外的区别?
  • 我们应该有两行在 .cpp 文件中包含 PchApp.h 和 pragma hdrstop 吗?有没有办法只在项目选项中做到这一点,而不是在每个文件中复制这两行?他们有必要吗?

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

    在 RAD Studio XE4 中

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

    1. 默认行为

    创建新的 VCL Forms 项目时,IDE 会创建一个标题 named by default Project1PCH1.h, which is intended to be the project's precompiled header.此标题包括 <vcl.h><tchar.h> ,并在项目管理器中显示为一个节点。它不包含在默认的 Form1.cpp 中,而是 #include <vcl.h>其次是 #pragma hdrstop位于 Form1.cpp 的最顶部,然后是其他标题。

    使用此标题的新项目的默认 XE4 设置对话框是:
    XE4 default precompiled header settings

    我(天真地?)假设默认值实际上是最好的/最优化的设置。有些事情让我困惑:
  • 项目假定的预编译头文件 Project1PCH1.h在任何地方的预编译头设置中都没有提到。
  • header 未缓存
  • 未指定 PCH 文件名(应该是 Project1PCH1.h 吗?)
  • .cpp 文件不包括 Project1PCH1.h任何一个。

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

    这对我来说是最令人费解的事情,也是提出这个问题并澄清我对 PHes 的所有困惑的冲动。我曾计划复制/使用 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 并将其替换为特定 .cpp 文件所需的 PchApp.h 中的 header 子集,它们应该位于 #pragma hdrstop 之上还是之下? (以上,我想。)如果你在上面包含了预编译头文件中未包含的其他内容 - 它会改变该特定单元的 PCH 使用,导致 PCH 被重建(性能问题?)等等?
  • 默认设置:假设新项目的默认设置是最佳的,如何最好地迁移当前系统以使用它?
  • 非默认设置:如果默认设置不是最佳的,那是什么?我想,这是关键问题。
  • 32 位和 64 位:知道我们很快就会迁移到 64 位,我们应该怎么做才能让预编译的头文件同时在 32 位和 64 位上工作?所有 PCH 知识都应该在项目选项中而不是 .cpp 文件中,因此 32 位和 64 位编译的设置不同吗?

  • I am seeking a clear, detailed, explanatory, guiding answer, one that clearly explains the best practice, setting options, items to include in the .cpp files, header, and/or project file, and so forth - in other words, something to clear up my by now (after all the above!) rather confused understanding. A high-quality answer that can be used as the go-to PCH reference in future by other C++Builder users in future would be excellent. I intend to add a bounty in a couple of days when I am able to.

    最佳答案

  • 现有设置。 根据我的经验,我通常会更改这些设置,因为如果您有数百个文件 - 它似乎并不是最佳选择。在 xCode 中,即它是默认配置。应该没有编译性能差异。
  • 使用 PCH 向导 老实说,我从未在实际项目中使用过它,它并没有给我留下深刻印象,所以忘记了这一点并使用手动设置。
  • CPP 文件/单位和正确的包含。 不同的 IDE 对此有不同的默认设置。我通常使用的是:
  • 自动注入(inject)预编译头文件(在 .cpp 中无需手动 #include)
  • 如果存在,则首先包含与 .cpp 匹配的适当头文件(myfile.cpp - 然后包含 myfile.h)
  • 之后包括所有执行特定工作的特定头文件(特定的 lib 头文件等)
  • 在“myfile.h”中只包含必须的内容。避免任何可以避免的东西。
  • 您专门为特定 .cpp 文件包含的所有内容都应低于 #pragma hdrstop。你想要预编译的一切都应该在上面。
  • 默认设置 我不认为它是最佳的。至于我,只需更改设置中的几个选项即可轻松迁移。
  • 非默认设置 正如我上面提到的 - 对我来说,最佳设置是自动注入(inject)预编译头文件。更多详情请见第 3 项。
  • 32 位和 64 位 没有遇到任何问题。它应该为每个特定配置生成自己的预编译头文件。
  • 关于c++builder - 在现代 C++Builder 应用程序中使用预编译头文件的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062823/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com