当前位置: 首页 > 知识库问答 >
问题:

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

卫烨烁
2023-03-14

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

我在看助推器的留档,我在说明中看到他们说:

在配置属性中

然后他们解释道:

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

  1. 有人能解释一下我用黑体标出的句子吗?他们正在谈论哪些特定于视觉工作室的变化?(以下是我正在阅读的文档的链接:http://www.boost.org/doc/libs/1_55_0/more/getting_started/windows.html#pch)
  2. 为什么以及何时我想关闭预编译头
  3. 预编译头选项中的“创建”和“使用”有什么区别

共有3个答案

白和泽
2023-03-14

当预编译头文件打开时,每个cpp源文件必须以#include "stdafx.h "开头

因此,如果您不想编辑所有的boost源文件,可以将其关闭。

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

阎裕
2023-03-14
匿名用户

当您使用预编译的头文件时,您需要做如下事情:

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

#pragma hdrstop

// other code here

< code>#pragma之前的所有内容都进入预编译头。之后的一切都依赖于预编译头文件。使预编译头工作的VC特有的“魔力”是< code>#pragma。

这个故事不仅仅是这样。为了使预编译的头文件正常工作,您希望在每个源文件中以完全相同的顺序包含完全相同的头文件集。

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

然后,当编译器完成它的工作时,有两个阶段:首先你需要创建一个预编译的头文件。这意味着用一个开关运行编译器。编译器只查看< code>#pragma hdrstop之前的内容,构建一个符号表(诸如此类)并将数据放入< code >中。pch文件。

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

这意味着每个源文件通常都包含许多它实际上不需要的标头。反过来,这意味着如果您不使用预编译的标头,则最终的编译速度比您根本没有做任何事情来支持预编译的标头要慢得多。

换句话说,虽然唯一绝对需要的部分是< code>#pragma hdrstop,这是相当无害的,但是需要进行大量的文件重构才能从中受益——如果您使用不支持预编译头文件的任何东西(就像VC那样),这些改变很可能会大大降低编译时间。

司马自明
2023-03-14

最初是一个评论,但我不妨发布它。注意:这是VC特有的:

>

  • 粗体的句子是他们表示样本没有遵循统一使用pch生成模型的标头。瞧,他们的示例对PCH不友好,但如果正确配置,您仍然可以在项目中使用PCH和boost。

    你会因为各种各样的原因关掉它们。一些源模块,尤其是来自第三方的模块,并没有遵循PCH模型,在它们的开始就包含了pch-through-header。他们的示例就是这样的代码(因此建议在他们的示例中关闭它们)。有时,源文件只对此文件需要不同的预处理器配置,而不是项目中的所有文件;另一个原因禁用这些文件的PCH。

    您通常使用源/标头对来生成“The One”;预编译的标头图像。此头文件通常包括:

    1. 项目使用的任何系统标准库标头
    2. 第三方 SDK 标头
    3. 几乎所有其他未为您的项目进行主动开发的内容。

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

    简而言之(难以置信),

  •  类似资料:
    • 问题内容: 我想知道如果不关闭ResultSet是否可以将其关闭?我有一个ResultSet已关闭异常,但是我确定我没有在任何地方关闭ResultSet。我的确切做法是,我使用ResultSet来执行SELECT查询,然后使用相同的ResultSet,因为此方法调用了ResultSet: 那么,另一个问题是:有没有一种方法可以确保打开ResultSet? 第三个问题:也许是问题所在,因为我从不关闭

    • 问题内容: 我在ORM上还很新。我刚刚开始阅读有关使用Hibernate的Java Persistence API的书籍和文档。 我只是想知道,关闭EntityManagerFactory与jdbc数据库连接关闭类似吗? 我们是否应该在每次持久/更新/删除后关闭它?如果我们不关闭它,数据库连接会保持打开状态吗? 问题答案: 我只是想知道,关闭与jdbc数据库连接关闭类似吗? 这并非完全正确,但关闭

    • 问题内容: 我听说在某些情况下,由于JIT优化,Java程序或Java程序的某些部分比C ++(或其他预编译的代码)中的“相同”代码执行得更快。这是由于编译器能够确定某些变量的范围,避免某些条件并在运行时提取类似的技巧。 您能否举一个(或更佳的)例子,在哪里适用?也许概述了编译器能够优化字节码的确切条件,超出了预编译代码的范围? 注意: 此问题 不是 关于将Java与C ++进行比较。关于JIT编

    • 问题内容: 我想要的不是Redis和MongoDB之间的比较。我知道他们是不同的。性能和API完全不同。 Redis的速度非常快,但是API的“原子性”非常好。MongoDB将占用更多资源,但是该API非常易于使用,对此我感到非常满意。 它们都很棒,我想在部署中尽可能多地使用Redis,但是很难编写代码。我想在开发中尽可能多地使用MongoDB,但是它需要一台昂贵的机器。 那么您如何看待两者的使用

    • 本文向大家介绍什么是预编译,何时需要预编译:相关面试题,主要包含被问及什么是预编译,何时需要预编译:时的应答技巧和注意事项,需要的朋友参考一下 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

    • 我在自定义视图的不同方法中多次使用同一个光标。我应该在每次使用后关闭光标还是可以一直打开直到视图被破坏?对于数据库也是一样,一旦创建了包含此视图的活动,就可以打开它吗?当活动被销毁时,它可以关闭吗?我不断收到一个错误“close()从未在数据库上显式调用过…”当我按照上述方法操作时。