我什么时候想在visual studio中关闭“预编译头”?

时间:2014-01-19 21:29:14

标签: c++ boost precompiled-headers

首先,我想说我读到了预编译的头文件,我知道这是一种优化,可以节省我在每次构建时反复编译头文件的时间。

我正在阅读提升文档,我在他们说的说明中看到了:

  

在配置属性> C / C ++>预编译标题,将使用预编译标题(/ Yu)更改为不使用预编译标题

然后他们解释:

  

使用Boost预编译头文件没有问题; 这些说明仅仅避免了预编译的头文件,因为它需要对示例中使用的源代码进行Visual Studio特定的更改。

  1. 有人可以解释我用粗体标记的句子吗?他们正在谈论哪些视觉工作室的具体变化? (这是我正在阅读的文档的链接:http://www.boost.org/doc/libs/1_55_0/more/getting_started/windows.html#pch
  2. 为什么以及何时需要关闭预编译的标头?
  3. 预编译标题选项中“创建”和“使用”之间的区别是什么。

3 个答案:

答案 0 :(得分:4)

最初是评论,但我也可以发布。注意:这是VC ++特有的:

  1. 大胆的句子是他们说这些样本不遵循统一使用的咒语 - 这种导入头的生成模型。 IOW,他们的样本不是PCH友好的,但如果配置正确,你仍然可以在项目中使用pch和boost。

  2. 您会因各种原因将其关闭。一些源模块,特别是来自第三方的模块,不遵循PCH模型,包括"" pch-through-header一开始。他们的样本是这样的代码(因此建议他们为他们的样本关闭它们)。有时源文件只需要对这些文件使用不同的预处理器配置,而不是所有项目中的文件;禁用这些文件的PCH的另一个原因。

  3. 您通常使用 源/标头对来生成" One&#34 ;;预编译的头文件图像。此头文件通常包括:

    1. 项目使用的任何系统标准lib标头
    2. 第三方SDK标头
    3. 几乎所有其他不在您的项目的活动开发中。
  4. 标记为创建的单个源文件通常包含一行代码:#include "YourHeaderFile.h",其中YourHeaderFile.h是您从上面列表中填充的标题。将其标记为"创建"通过标题YourHeaderFile.h告诉VC它是在编译其他源文件时通过该标题重建PCH所需的文件。所有其他源文件都标记为使用(PCH关闭的文件除外),并应包含相同的{em>第一行代码#include "TheHeaderFile.h"

    简而言之(很难相信),<boost>告诉您他们的样本没有像上面描述的那样设置,因此在构建它们时应该关闭PCH

答案 1 :(得分:3)

使用预编译的标题时,您需要执行以下操作:

#include <foo>
#include <bar>
#include <baz>

#pragma hdrstop

// other code here

之前的所有 #pragma进入预编译的标头。之后的一切都取决于预编译的头。使预编译头工作的VC ++特定“魔术”是#pragma

尽管如此,故事还有更多内容。要使预编译的头文件,您希望在每个源文件中以完全相同的顺序包含完全相同的头文件集。

这导致(通常)创建一个包含所有其他公共标题的标题,并在其末尾有#pragma hdrstop权限,然后将其包含在所有其他源文件中。

然后,当编译器执行其操作时,有两个阶段:首先需要创建预编译的头。这意味着使用一个开关运行编译器。编译器只查看之前 #pragma hdrstop的内容,构建符号表(等等)并将数据放入.pch文件。

然后是使用预编译头进行构建时的阶段。在此阶段,编译器只会忽略文件中的所有内容,直至#pragma hdrstop。当它到达时,它从.pch文件读取编译器的内部状态,然后开始编译该单个文件。

这意味着每个源文件通常包含许多实际上不需要的头文件。反过来,这意味着如果你使用预编译的头文件,你最终会得到比你没有做任何事情来支持预编译头文章要慢得多的编译。

换句话说,虽然绝对所需的唯一部分#pragma hdrstop,这是非常无害的,但需要更多的文件重构才能从中获得更多好处 - 如果你使用的是任何不支持预编译头文件的东西,那么这些更改可能会对编译时间产生很大的影响(就像VC ++在那里做的那样)。

答案 2 :(得分:1)

当预编译头文件出现时,每个cpp源文件必须以#include“stdafx.h”开头

因此,如果您不想编辑所有增强源文件,请将其关闭。

当预编译头文件在stdafx.cpp上时,“创建”预编译头文件。所有其他文件“使用”预编译的头文件。