我遇到了有关预编译 header 和#include指令的用法的理解问题。
因此,我在这里得到了“stdafx.h”,并在其中包含了例如vector,iostream和string。显然,关联的“stdafx.cpp”仅包含“stdafx.h”。
因此,如果我设计自己的头文件使用例如vector或iostream中的“代码”,则必须包含头文件,因为编译器当时不知道声明。那么,为什么这里的一些帖子(include stdafx.h in header or source file?)说,即使其他文件包含所需的声明,例如在其他头文件中包含“stdafx.h”也不是一件好事。 vector ?因此,基本上没有关系直接包含 vector 或预编译的头文件都一样。
我当然知道,如果关联的源文件包含所需的头文件,则不必在另一个头文件中包含头文件,因为那时声明是已知的。好吧,这仅在头文件包含在某处的情况下才有效。
所以我的问题是:我应该避免在任何源文件中包含预编译的头文件,为什么?我有点困惑,因为我正在网上阅读矛盾的表达,我无论如何都不应该在头文件中包含任何内容,否则包含在头文件中?
那现在怎么了?
最佳答案
这将是一个有意图的笼统声明。 Visual Studio项目follows this general design中PCH的典型设置,值得回顾。说:
PCH主 header 不包含在 header 文件中。设计标题时,这样做的目的是包括要编译的标题所需的所有内容(并且仅包含所需的内容)。如果包含源文件的实现需要其他包含内容,则可以在标题之后根据需要将其包含在内。
以下是我如何设置在.h和.cpp文件中使用多个标准 header 的项目的示例。
myobject.h
#ifndef MYAPP_MYOBJECT_H
#define MYAPP_MYOBJECT_H
// we're using std::map and std::string here, so..
#include <map>
#include <string>
class MyObject
{
// some code
private:
std::map<std::string, unsigned int> mymap;
};
#endif
请注意,无论是否使用PCH,上述 header 都应在包含的任何.cpp中进行编译。转到源文件...
myobject.cpp
// apart from myobject.h, we also need some other standard stuff...
#include "myobject.h"
#include <iostream>
#include <fstream>
#include <algorithm>
#include <numeric>
// code, etc...
注意
myobject.h
不希望您包含它依赖的内容。它在 header 中不使用<iostream>
或<algorithm>
等;我们在这里使用它。这是没有PCH的典型设置。现在我们添加PCH主站
添加PCH主标题
那么,我们如何设置PCH主 header 为该事情提供涡轮增压功能呢?为了这个答案,我只处理标准的头文件和第三方库头文件,这些头文件不会随项目开发而发生变化。您将不再要编辑
<map>
或<iostream>
(如果是,请检查一下头)。反正...stdafx.cpp
)如何负责生成PCH,其余的源文件随后通过包含stdafx.h
来使用said-PCH。 因此,首先是PCH主 header :
stdafx.h
#ifndef MYAPP_STDAFX_H
#define MYAPP_STDAFX_H
// MS has other stuff here. keep what is needed
#include <algorithm>
#include <numeric>
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#endif
最后,配置为使用此文件的源文件然后执行此操作。所需的最小更改是:
更新:myobject.cpp
#include "stdafx.h" // <=== only addition
#include "myobject.h"
#include <iostream>
#include <fstream>
#include <algorithm>
#include <numeric>
// code, etc...
注意我说的最少。实际上,当PCH主机将它们插入时,这些标准头都不再需要出现在.cpp中。换句话说,您可以执行以下操作:
更新:myobject.cpp
#include "stdafx.h"
#include "myobject.h"
// code, etc...
是否选择取决于您自己。我喜欢保留它们。是的,它可以延长源文件的预处理器阶段,因为它拉入了头文件,进入了include-guards,并丢弃了所有内容,直到最终的
#endif
为止。如果您的平台支持#pragma once
(而VS则支持),则将成为无人问津。但是请不要误会:所有这些中最重要的部分是头
myobject.h
完全没有更改,并且不包含或不了解PCH主头。它不必,也不应该构建,因此必须。
关于c++ - 理解问题: Precompiled headers & include usage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905712/