我继承了一些像这样做的代码,
标题:HeaderFile.h
#ifndef HEADERFILE_H
#define HEADERFILE_H
#ifndef HEADERFILE_PCH_H
#include<LibStuff>
#include<LibStuff2>
#include<LibStuff3>
#include<LibStuff4>
#include<LibStuff5>
#endif
#include "FilesInProject"
Class A
{
//Code
};
#endif
Cpp:HeaderFile.cpp
#include "HeaderFile_pch.h" //(1)
#include "HeaderFile.h"
//More code
我理解预编译头的用途以及代码在这里做了什么(有点)。当我将这些文件复制到我的项目中时,这样我就可以更新已弃用的代码,但不会影响原始项目VS2010在(1)
行的阻塞。 VS2010说它无法找到该文件。
我已经介入这两个项目之间,我找不到任何设置上的差异。
我错过了什么,为什么可以将PCH
嵌入到这样的标题中,而不是将它们实际移动到名为HeaderFile_pch.h
的文件中。这是某种宏观黑客吗?
答案 0 :(得分:5)
首先,您在上面提供的示例中没有Headerfile_pch.h这样的文件,也不会在您的本地fs上。
Visual C ++允许您定义几种设置预编译头文件的方法。最常见的是在项目配置级别为所有源文件启用它,在Configuration Properties / C ++ / Precompiled Headers下,设置“Precompiled Header”,选择“Use”。设置“预编译头文件”的相同位置通常是“stdafx.h”,但可以是您选择的任何内容。所有文件都将获得此设置(因此在项目级别进行配置)除外....
一个文件负责生成PCH文件。该文件通常是项目中的stdafx.cpp文件,但同样,它可以是您想要的任何单一来源。大多数只是设置一个虚拟cpp文件,其中包含一件事:#include“myheader.h”(duh)..为这一个文件配置预编译标题,从“使用”切换到“创建”。这可以确保如果PCH的prime-header不同步,则首先重新编译源文件,以便在其他文件被启动之前重新生成PCH数据文件。
这个属性绝对是强制性的:包含标题(myheader.h或其他任何你调用它)必须是第一个包含在你正在编译的任何源文件中参与使用pch包括(希望显然)您指定为“生成器”的文件(前一段中标记为“创建”的文件)。
最后,如果由于构建环境中的异常情况(即执行愚蠢事情的第三方标头)导致问题,可以逐个禁用pch。
在Visual Studio中还有其他配置PCH设置的方法,但这是最常见的远。