2010-05-22 47 views
4

有一个.h文件和一个.cpp文件具有相同的名称但扩展名不同。C++头文件和实现文件:包含什么?

如果我想用什么在.cpp文件,我包括.h文件或.cpp文件?

+0

许多模糊包括http://stackoverflow.com/questions/280033/c-header-files-code-separation – 2010-05-22 09:33:55

回答

22

简单的答案是,你几乎总是想包含.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文件。

+4

+1很好的答案,没有任何“从不”。人们应该使用常识来分割代码。是的,按照惯例,头文件(* .h)的设计必须能够在任何地方安全地包含,而不会在编译单元中施加任何额外的依赖性或副作用(如具有“使用名称空间...”)它包括在内。 – bobah 2010-05-22 09:41:28

+0

只是为了澄清,当你说“包含.h文件和编译.cpp文件”时,你的意思是除了包含来自所谓主类的头文件(.h)之外,还必须添加实现( .cpp)文件与主类一起用于编译器行? – StockB 2013-03-05 18:47:24

+0

@StockB:由于C++中没有“主类”,所以不清楚你的意思是“与主类一起”,但你所说的含糊不清。另外,不同的编译器工作方式不同,所以我不能说你可以肯定地将多个cpp文件添加到你正在使用的编译器的命令行中。主要区别在于'.h'文件倾向于包含在内,而'.cpp'往往直接传递给编译器。 – 2013-03-05 19:18:38

3

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

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

+0

不是说OP在问这个问题,但是你可能想在定义模板代码时包含源文件。如果您试图将转发声明和实现保存在单独的文件中,或者您正在解决与模板相关的代码扩展问题,您可能会这样做。请参阅:http://www.parashift.com/c++-faq-lite/templates.html – 2010-05-22 09:35:50

2

通常,最好在头文件中写的.h

#ifndef H_someClass 
#define H_someClass 

类SomeClass的{市民: 无效SomeFunction(); };

#endif 

,为了不要让错误关于重新定义,当u需要在其他文件.cpp文件。