我有一个示例项目(不是我的)在Visual C ++ 6中。我正在尝试将其转换为Visual Studio 2008。
较旧的项目正在使用预编译的标头。现在的问题是:
什么是预编译标题?
由于旧项目使用预编译头。我还将在Visual Studio 2008(新项目)中使用它们。但我得到的错误是“你忘了包含stdafx.h”,为了解决这个问题,我在每个源文件中加入了“stdafx.h”。这非常有效。但是旧项目在每个文件中都没有包含“stdafx.h”?那么如何选择退出在每个源文件中包含“stdafx.h”。因为不是每个源文件都需要“stdafx.h”中定义的包含文件,所以只有少数文件。怎么做的?
编辑: 我如何使用预先设定的标题来解释某些文件?
答案 0 :(得分:55)
什么是预编译标题?
C ++源文件通常包含来自外部库的标头。在Windows中,您包含windows.h
。这些头文件可能非常大,需要一些时间来处理。每次编译C ++文件时,编译器都必须从这些头文件中读取和处理数千行。但是外部库不会更改,如果您只处理这些文件一次并保存结果,则可以节省大量时间。
预编译头文件只是一堆头文件,已经处理成中间格式,以后编译器可以一次又一次地使用它。
Visual C ++中预编译的标头
在Visual C ++中,#include
中所有不变的头文件都是stdafx.h
的习惯。然后指示编译器在编译stdafx.pch
时创建预编译头stdafx.cpp
,除了包含stdafx.h
之外什么也不做。如果要在另一个.cpp
文件中使用预编译头,则必须包含stdafx.h
作为第一个包含文件,并指示编译器使用stdafx.pch
作为预编译头。
如果收到有关不包括stdafx.h
的错误,则只需指示编译器不要对该特定源文件使用预编译头。 (或者您可以包含stdafx.h
。)
各个源文件的预编译标头设置
Visual C ++允许您控制整个项目和单个文件的编译器设置。要访问单个属性,请在解决方案资源管理器中选择源文件,右键单击它并从上下文菜单中选择属性。可在配置属性 =>中找到预编译标头的选项。 C / C ++ => 预编译标题。如果您修改这些设置,通常需要对所有配置执行此操作(例如 Debug 和 Release )。
当您使用预编译头时,您将拥有整个项目的设置,指示编译器使用stdafx.pch
作为预编译头。 stdafx.cpp
将有一个单独的设置,指示编译器生成stdafx.pch
,如果您有一些不包含stdafx.h
的源文件,您可以在这些设置上设置单独的设置以便不使用预编译的头文件。
答案 1 :(得分:4)
编译代码时,编译器必须查看所有#included标头,以了解如何编译.cpp文件中的代码。
对于大型项目(或使用像MFC这样的库的项目),这些标题可能会变得很大,因此需要很长时间才能编译。
因为大多数这些头文件经常不会改变(如果有的话),你可以让编译器“预编译”它们 - 它处理它们并将其状态保存到预编译的头文件中。下次编译时,它不需要再次读取和编译所有这些头文件,因此速度要快得多。
Visual Studio中的一个要求是,如果使用预编译头,则必须将其包含在项目的每个文件中。
如果项目很小,或者您不经常构建项目,则可以禁用“预编译标题”选项(在项目设置中。这适用于整个项目)。您将获得的唯一影响是它可能编译得更慢。或者保持选项启用,只需添加#include“stdafx.h”作为每个文件中的第一个包含。
答案 2 :(得分:0)