预编译头文件 - 必须从所有其他文件中删除所有预编译头文件

4

我有一个非常大的项目,为了编译速度的缘故,我开始测试预编译头文件。

我现在已经设置好了:

  • 在VS中启用预编译头文件(仅为StdAfx.h创建项目并将其用于项目)
  • 为除StdAfx.h之外的所有文件使用多处理器编译
  • 通过VS的强制包含自动包含所有文件中的StdAfx.h

现在出现的问题是:

我是否需要删除添加到StdAfx.h文件中的所有项目文件的所有包含,还是这是不必要的?编译器是否会自动跳过任何包含,因为它知道它是StdAfx.h的一部分,或者我应该手动从每个.h/.cpp文件中删除它们?


只要包含保护措施健全,这就不是问题。但效率当然不高,预处理器仍会浏览整个文件。非标准的 #pragma once 可以提高效率。 - Hans Passant
你认为在这个大项目中,使用#pragma once代替或附加到包含保护(目前我在大多数文件中使用包含保护)会产生明显的差异吗? - prom85
1个回答

3
良好的实践是使每个文件直接包含该文件直接需要的所有头文件。这样,在特定文件中更改头文件应仅影响该文件。如果您开始依赖于其他地方已经包含的头文件,将使项目结构变得极其脆弱。单个“常见包含”文件是这种情况的极端情况。预编译头文件的使用旨在通过预先构建常用的头文件来加速编译,但是项目文件不应假设某些内容已经被包含在其中。因此,没有必要从“.h/.cpp”中删除包含,实际上有一些工具可以基于项目文件中的包含填充预编译头文件。由于头文件保护,编译器将跳过已经包含在预编译头文件(或其他头文件)中的文件。

1
这就是我想知道的。无论如何,我想在我的项目中保留手动包含,因为我在另一个旧项目中使用了一些文件,我不想调整以使用预编译头文件(它每年只编译一次)。只是不确定在所有文件中都有包含是否会减慢构建过程,因为它无法识别这些是预编译的,并因此做出不必要的事情。谢谢。 - prom85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接