应该重新包含已经在项目范围预编译头中的东西吗?

时间:2010-09-11 13:01:14

标签: c++ include precompiled-headers

不确定这是否重复,如果是,请链接到类似的问题。

我有一个预编译的头文件stdafx.h,它在我的项目中的所有源文件中使用。因此,stdafx.h中的所有头文件都可以在项目的所有代码文件中使用。

我不确定的是,是否在预编译的头文件中重新包含alrdy的东西。你们觉得怎么样?

e.g。

stdafx.h中

#pragma once

#include <memory>

my_class.h

#pragma once

#include <memory> // Re-include or not that's the question. Best practice?

struct my_class
{
};
typedef std::shared_ptr<my_class> my_class_ptr;

的main.cpp

#include "stdafx.h"
#include "my_class.h"

int main()
{
}

编辑:添加一次编译指示

3 个答案:

答案 0 :(得分:3)

我会包含它,以便标题可以在具有不同stdafx.h的项目中重用。说明这一点的另一种方式是每个标题应该包含它自己需要的所有声明(最好是前向的)

由于内部头文件保护(或VS头文件中的#pragma:once一次)不会处理头文件的内容,因此不会有任何性能损失。

答案 1 :(得分:1)

在标题中,您应该包含所有内容,这是单独使用该标题所必需的。如果您在标头中使用std::shared_ptr且该模板来自memory标头,请添加memory标头。

当您设计标题时,您的目标应该是使其完整,以便当有人包含它时,他/她不会因未解析的引用而导致错误。不要担心可能会重复包含某些标头。还有其他机制可以防止这种情况发生。

顺便说一句,也可以在标题中使用这些机制(例如#pragma#ifndef / #define)。

答案 2 :(得分:1)

最佳做法是尽可能使用前瞻性声明。拥有不必要的包含可能会增加编译时间。如果实现使用它,则始终在文件中包含标头,即使它已包含在先前包含的文件中。这样,如果有一天你需要从前一个文件中删除头包含,你不会在这个文件中导致错误,文件也不需要任何修改。