首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时在visual studio中关闭“预编译头”?

何时在visual studio中关闭“预编译头”?
EN

Stack Overflow用户
提问于 2014-01-19 21:29:14
回答 3查看 6.9K关注 0票数 0

首先,我想说,我读过关于预编译头的文章,我知道这是一个优化,可以节省我在每个构建上反复编译头的时间。

我正在阅读boost的文档,我在说明中看到了这一点:

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

然后他们解释说:

在预编译头中使用Boost是没有问题的;这些指令只是避免预编译头,因为它需要对示例中使用的源代码进行特定于Visual的更改。

  1. 有人能解释我用黑体字标出的句子吗?他们谈论的是哪些特定的视频工作室更改?(以下是我正在阅读的文档链接:started/windows.html#pch)
  2. 为什么和何时我要关闭预编译的头?
  3. 在预编译的头选项中,“创建”和“使用”有什么区别。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-19 22:23:53

最初是一个评论,但我也可以张贴它。注意:这是特定于VC++的:

  1. 粗体的句子是他们说样本不遵循统一使用的口号-这是在头中领先的pch代模式。IOW,它们的示例并不是pch友好的,但是如果配置得当,您仍然可以在项目中使用带有boost的pch。
  2. 你会因为各种各样的原因而把它们关掉。一些源模块,特别是来自第三方的模块,并不遵循PCH模式,即在一开始就包含“pch-通过头”。他们的样本就是这样的代码(因此建议关闭他们的样本)。有时源文件只需要对此文件进行不同的预处理器配置,而不是对项目中的所有文件进行配置;这也是禁用这些文件PCH的另一个原因。
  3. 您通常使用源/头对来生成"the One";预编译的标头映像。此头文件通常包括:

代码语言:javascript
复制
1. Any system standard lib headers used by your project 
2. 3rd-party SDK headers 
3. Just about everything else that is NOT in active development for _your_ project. 

标记为Create的单个源文件通常包含一行代码:#include "YourHeaderFile.h",其中YourHeaderFile.h是您填充了上面列表中的内容的标题。通过头文件将其标记为"Create“,YourHeaderFile.h告诉VC,在编译其他源文件时,它是通过该头重新构建PCH所需的文件。所有其他源文件都被标记为使用(除了关闭PCH的源文件),并且应该包含相同的#include "TheHeaderFile.h"作为其第一行代码。

简而言之(难以置信),<boost>告诉您它们的示例不像上面描述的那样设置,因此在构建它们时应该关闭它们。

票数 4
EN

Stack Overflow用户

发布于 2014-01-19 22:14:06

当使用预编译的头文件时,需要执行以下操作:

代码语言:javascript
复制
#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++那样做的那样)。

票数 3
EN

Stack Overflow用户

发布于 2014-01-19 21:34:52

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

因此,如果您不想编辑所有的boost源文件,就会关闭它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21222922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档