1

我有一个预编译的头文件 stdafx.h 用于我项目中的所有源文件。因此,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;

主文件

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

int main()
{
}
4

3 回答 3

3

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

由于内部标头保护(或对于 VS 头文件中的 #pragma:once),不会处理标头的内容,因此不会对性能造成任何影响。

于 2010-09-11T13:24:07.327 回答
1

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

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

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

于 2010-09-11T13:35:06.410 回答
1

最佳做法是尽可能多地使用前向声明。有不必要的包含可能会增加编译时间。如果实现使用它,则始终在文件中包含标题,即使它包含在先前包含的文件中。这样,如果有一天您需要从前一个文件中删除标头包含,您将不会在此文件中导致错误,并且该文件不需要任何修改。

于 2010-09-11T13:35:19.630 回答