C++标头和实现文件:要包含哪些内容?

neu*_*cer 4 c++ implementation header

有.h文件和.cpp文件,名称相同但扩展名不同.

如果我想使用.cpp文件中的内容,是否要包含.h文件或.cpp文件?

Mer*_*ham 23

简单的答案是你几乎总是想要包含.h文件,并编译.cpp文件.CPP文件(通常)是真正的代码,H文件(通常)是前向声明.

更长的答案是你可以包括其中任何一个,它可能对你有用,但两者都会给出略微不同的结果.

"包含"的作用基本上是在该行复制/粘贴文件.扩展名是什么并不重要,它将以相同的方式包含文件的内容.

但按照惯例,C++代码通常以这种方式编写:

SomeClass.cpp -

#include "SomeClass.h"
#include <iostream>

void SomeClass::SomeFunction()
{
  std::cout << "Hello world\n";
}
Run Code Online (Sandbox Code Playgroud)

SomeClass.h -

class SomeClass
{
  public:
    void SomeFunction();
};
Run Code Online (Sandbox Code Playgroud)

如果包含其中任何一个,则可以使用其中的代码.但是,如果您有多个包含相同.cpp文件的文件,则可能会出现有关重新定义的错误.头文件(.h文件)通常只包含前向声明,没有实现,因此将它们包含在多个位置不会给您带来有关重新定义的错误.

如果你在包含来自其他.cpp文件的.cpp文件时以某种方式设法编译而没有错误,你仍然可以得到重复的代码.如果在多个其他文件中包含相同的.cpp文件,则会发生这种情况.这就像你写了两次函数.这将使您的程序在磁盘上更大,编译时间更长,运行速度更慢.

主要的警告是,对于使用模板的代码,此实现/转发声明约定不适用.模板代码仍将作为.h文件传递给您,但它(通常)直接在.h文件中实现,并且不会附带.cpp文件.

  • +1很棒的答案,没有任何"永无止境".在分割代码时,总是应该使用常识.是的,按照惯例,头文件(*.h)的设计必须能够安全地包含在任何地方,而不会在编译单元上施加任何额外的依赖关系或副作用(比如"使用命名空间...")它包括在内. (4认同)