【问题标题】:Precompiled Headers预编译头文件
【发布时间】:2010-11-20 13:57:32
【问题描述】:

我有一个 Visual C++ 6 中的示例项目(不是我的)。我正在尝试将其转换为 Visual Studio 2008。

旧项目使用预编译的头文件。现在的问题是:

  1. 什么是预编译头文件?

  2. 因为旧项目使用的是预编译头文件。我还将在 Visual Studio 2008(新项目)中使用它们。但是我收到错误消息说“你忘记包含stdafx.h”,为了解决这个问题,我在每个源文件中都包含“stdafx.h”。那工作得很好。但是旧项目没有在每个文件中都包含“stdafx.h”?那么我如何选择退出在每个源文件中包含“stdafx.h”。因为不是每个源文件都需要“stdafx.h”中定义的包含文件,所以只有少数需要。这是怎么做到的?

编辑: 如何使用预编译的标头排除某些文件?

【问题讨论】:

    标签: visual-studio-2008 visual-c++-6 precompiled-headers


    【解决方案1】:

    什么是预编译头文件?

    C++ 源文件通常包含来自外部库的头文件。在 Windows 中,您包括 windows.h。这些头文件可能非常大,需要一些时间来处理。每次编译 C++ 文件时,编译器都必须从这些头文件中读取和处理数千行。但是外部库不会改变,如果您只处理这些文件一次并保存结果,您可以节省大量时间。

    预编译的头文件只是一堆头文件,它们已经被处理成中间形式,以后可以被编译器一次又一次地使用。

    Visual C++ 中的预编译头文件

    在 Visual C++ 中,习惯上将#include 中所有不变的头文件放在stdafx.h 中。然后,您指示编译器在编译 stdafx.cpp 时创建预编译头 stdafx.pch,它只包含 stdafx.h。如果您想在另一个 .cpp 文件中使用预编译头文件,则必须将 stdafx.h 作为第一个包含文件并指示编译器将 stdafx.pch 用于您的预编译头文件。

    如果您收到关于不包含 stdafx.h 的错误,您只需指示编译器不要为该特定源文件使用预编译头文件。 (或者你可以包括stdafx.h。)

    单个源文件的预编译头设置

    Visual C++ 允许您控制整个项目和单个文件的编译器设置。要访问单个属性,请在解决方案资源管理器中选择源文件,右键单击它并从上下文菜单中选择 Properties。预编译头文件的选项位于配置属性 => C/C++ => 预编译头文件。如果您修改这些设置,您通常会希望对所有配置(例如 DebugRelease)都这样做。

    当您使用预编译头文件时,您将对整个项目进行设置,指示编译器将stdafx.pch 用于预编译头文件。 stdafx.cpp 将有一个单独的设置,指示编译器生成 stdafx.pch,如果您有一些不包含 stdafx.h 的源文件,您可以在这些上设置单独的设置以不使用预编译的头文件。

    【讨论】:

      【解决方案2】:

      当您编译代码时,编译器必须查看所有 #included 标头以了解如何编译 .cpp 文件中的代码。

      对于大型项目(或使用 MFC 等库的项目),这些头文件可能会变得很大,因此需要很长时间才能编译。

      因为大多数这些头文件不会经常更改(如果有的话),您可以让编译器“预编译”它们 - 它会处理它们并将其状态保存到预编译的头文件中。下次编译时,不需要再读取和编译所有这些头文件,所以速度要快得多。

      Visual Studio 中的一个要求是,如果您使用预编译头文件,则它必须包含在项目中的每个文件中。

      如果项目很小,或者您不经常构建它,那么您可以禁用“预编译头”选项(在项目设置中。这适用于整个项目)。您将获得的唯一效果是它的编译速度可能会更慢。或者保持启用该选项,只需添加 #include "stdafx.h" 作为每个文件中的第一个包含。

      【讨论】:

      • 错了,MSVC6里怎么不用每个文件都包含预编译头???
      • 他(杰森·威廉姆斯)是对的。 stdafx.h 不会仅包含在那些不使用 stdafx.h 中包含的任何内容的文件中,例如 windows 头文件。否则,仔细观察,stdafx.h 可能会通过其他一些间接包含。
      • @Jason 不正确声明“Visual Studio 中的一个要求是,如果您使用预编译的标头,则它必须包含在项目中的每个文件中。”错误的。您可以选择加入或退出单个文件(没有/Y 开关);如果不能,您将很难在项目中混合 C 和 C++ 源文件。
      【解决方案3】:
      1. MSDN
      2. 通常。您需要在每个 cpp 文件中包含“stdafx.h”。关键是它们是预编译的,您不必担心并非所有这些都在某个具体文件中使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-09
        • 2020-07-19
        • 2015-01-03
        • 2015-01-05
        • 2012-09-08
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多