如果我有一个项目
main .cpp
Knife .h and .cpp
Cucumber .h and .cpp
并且我想在 Cucumber 中使用 Knife 的成员,是否使用以下内容是否重要:
#include "Knife.h"
#include <iostream>
using namespace std;
在 Cucumber.h 或 Cucumber.cpp 中(假设 Cucumber.cpp 已经包含 Cucumber.h)?
如果我有一个项目
main .cpp
Knife .h and .cpp
Cucumber .h and .cpp
并且我想在 Cucumber 中使用 Knife 的成员,是否使用以下内容是否重要:
#include "Knife.h"
#include <iostream>
using namespace std;
在 Cucumber.h 或 Cucumber.cpp 中(假设 Cucumber.cpp 已经包含 Cucumber.h)?
我的建议是尽量减少头文件中包含的文件数量。因此,如果可以选择,我更喜欢包含在源文件中。
修改头文件时,必须重新编译包含该头文件的所有文件。
因此,如果cucumber.h
包含knife.h
和main.cpp
包含cucumber.h
,并且您修改knife.h
,所有文件都将被重新编译(cucumber.cpp
和knife.cpp
)main.cpp
。
如果cucumber.cpp
includeknife.h
和main.cpp
includes ,而cucumber.h
你修改knife.h
, 只会重新编译,这样你的编译时间就减少了。cucumber.cpp
knife.cpp
如果您需要在黄瓜中使用刀,您可以这样进行:
// Cucumber.hpp
#ifndef CUCUMBER_HPP
#define CUCUMBER_HPP
class Knife;
class Cucumber
{
public :
///...
private :
Knife* myKnife
}
#endif
//Cucumber.cpp
#include "Cucumber.hpp"
#include "Knife.hpp
// .. your code here
这个“技巧”被称为“前向声明”。这是 C++ 开发人员众所周知的技巧,他们希望最大限度地减少编译时间。
是的,你应该把它放在.cpp
文件中。
您将拥有更快的构建、更少的依赖项以及更少的工件和噪音——在 iostream 的情况下,GCC 声明:
// For construction of filebuffers for cout, cin, cerr, clog et. al.
static ios_base::Init __ioinit;
在命名空间内std
。Knife.h
该声明将产生大量(冗余)静态数据,如果包含在许多文件中,则必须在启动时构建这些数据。所以有很多胜利,唯一的损失是你必须明确地包含你实际需要的文件——你需要它们的每个地方(这在某些方面也是一件非常好的事情)。
我所看到的建议是只包含给定源文件所需的最低限度,并尽可能多地包含在标题之外。在编译时,它可能会减少依赖关系。
要注意的另一件事是您的命名空间使用情况。您肯定要小心在标题中包含此类内容。它可能会更改您未计划的文件中的命名空间使用情况。
作为一般规则,尝试将您的包含添加到实现文件而不是标头中,原因如下:
如果您通过指针引用类或仅在标题中引用,则无需包含适当的标题;一个类声明就足够了。
可能还有很多其他原因 - 以上可能是最重要/最明显的原因。