3

我继承了一些类似这样的代码,

头文件: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's 嵌入这样的标题中,而不是将它们实际移动到名为HeaderFile_pch.h. 这是某种宏黑客吗?

4

1 回答 1

6

对于初学者,在您上面提供的示例中没有像 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 的主要头文件不同步,则首先重新编译源文件以重新生成 PCH 数据文件,然后再启动其他文件。

其一个属性是绝对强制性的:包含头文件(myheader.h 或您所称的任何内容)必须是您正在编译的任何参与使用 pch 的源文件中的第一个包含,包括(希望很明显)您指定为“生成器”的文件(在上一段中标记为“创建”的文件)。

最后,如果由于构建环境中的异常情况(即做愚蠢事情的第 3 方头文件)而导致问题出现,您可以逐个文件禁用 pch。

在 Visual Studio 中还有其他配置 PCH 设置的方法,但这是迄今为止最常见的方法。

于 2012-09-21T17:45:56.187 回答