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

时间:2010-05-22 08:41:20

标签: c++ header implementation

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

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

3 个答案:

答案 0 :(得分:23)

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

答案越长,您可以包含其中之一,它可能对您有用,但两者都会产生稍微不同的结果。

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

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

SomeClass.cpp -

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

void SomeClass::SomeFunction()
{
  std::cout << "Hello world\n";
}

SomeClass.h -

class SomeClass
{
  public:
    void SomeFunction();
};

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

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

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

答案 1 :(得分:3)

.h文件通常包含类声明,而.cpp文件包含类定义(实现)。您应该在.cpp文件中包含.h。

一个好的经验法则是永远不要包含.cpp文件,因为#include指令只是将包含文件的内容复制到包含文件中。你可能会以一些多重包含/定义结束,你绝对不想这样做。

答案 2 :(得分:3)

通常最好在头文件.h

中写入
#ifndef H_someClass
#define H_someClass

class SomeClass {
public:
    void SomeFunction();
};

#endif

以便在需要将.cpp文件包含在其他文件中时,不会出现有关重新定义的错误。