【问题标题】:Question about precompiled headers in Visual C++关于 Visual C++ 中预编译头的问题
【发布时间】:2010-11-22 09:41:44
【问题描述】:

如果我将一个标头 (ah) 放入 stdafx.h 并且该标头包含另一个在 stdafx.h 中未提及的标头 (bh),则每次有人包含 ah 或将其编译为啊?如果编译成a.h,当有人直接包含b.h时会发生什么?这会被预编译吗?

我提出这个问题的动机是我正在尝试优化我正在使用的软件的 stdafx.h 文件的内容。重建和增量构建时间对我们都很重要。我想知道是否可以简单地在所有 .cpp 文件中搜索#include 指令并计算每个文件被包含的次数。经常包含的文件可能是 stdafx.h 文件的良好候选者。当然,如果我不仅要考虑包含哪些文件,还要考虑包含的文件包含哪些文件,这种策略完全是假的。

我怀疑这很重要,但我们使用的是 Visual Studio 2005。

【问题讨论】:

标签: c++ visual-studio precompiled-headers stdafx.h


【解决方案1】:

a.h 和 b.h 将成为预编译头文件的一部分,以后不需要包含它们。您只需要在需要 a.h 或 b.h 的地方包含 stdafx.h 即可。如果您在 stdafx.h 之后显式包含 ah 或 bh (stdafx.h 包含之前的所有代码都被忽略),那么它不会被第二次编译(因为它们通常受#pragma once 指令或定义的保护),但是如果您询问它,编译器会在硬盘上打开该文件,

顺便说一句,你应该知道,你可以使用几个预编译的头文件(但每个 cpp 文件中不超过一个)。

【讨论】:

  • 你所说的在 stdafx.h 之后包含 ah 或 bh 在技术上是正确的——编译器将再次查看头文件——但大多数头文件使用 #pragma 一次或包含警卫以防止这种情况发生.事实上,我建议在任何需要它们的地方包含 ah 和 bh,即使 ah 在 stdafx.h 中 - 否则您以后将无法调整 stdafx.h 的内容,而不会遇到无穷无尽的编译错误列表。
  • 是的,它们不会被编译,但它们会被编译器从技术上打开。
  • 我同意 Nick 的想法很有帮助,但我只是担心会影响性能,因为我们需要做额外的磁盘 IO 才能找到 #progma once
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多