回答
简单的答案是,你几乎总是想包含.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很好的答案,没有任何“从不”。人们应该使用常识来分割代码。是的,按照惯例,头文件(* .h)的设计必须能够在任何地方安全地包含,而不会在编译单元中施加任何额外的依赖性或副作用(如具有“使用名称空间...”)它包括在内。 – bobah 2010-05-22 09:41:28
只是为了澄清,当你说“包含.h文件和编译.cpp文件”时,你的意思是除了包含来自所谓主类的头文件(.h)之外,还必须添加实现( .cpp)文件与主类一起用于编译器行? – StockB 2013-03-05 18:47:24
@StockB:由于C++中没有“主类”,所以不清楚你的意思是“与主类一起”,但你所说的含糊不清。另外,不同的编译器工作方式不同,所以我不能说你可以肯定地将多个cpp文件添加到你正在使用的编译器的命令行中。主要区别在于'.h'文件倾向于包含在内,而'.cpp'往往直接传递给编译器。 – 2013-03-05 19:18:38
.h文件通常包含类声明和.cpp文件的类定义(实现)。您应该在.cpp文件中包含.h。
好的经验法则是永远不要包含.cpp文件,因为#include
指令只是将包含文件的内容复制到包含文件中。你可能会以多种包含/定义结束,你肯定不想这样做。
不是说OP在问这个问题,但是你可能想在定义模板代码时包含源文件。如果您试图将转发声明和实现保存在单独的文件中,或者您正在解决与模板相关的代码扩展问题,您可能会这样做。请参阅:http://www.parashift.com/c++-faq-lite/templates.html – 2010-05-22 09:35:50
通常,最好在头文件中写的.h
#ifndef H_someClass
#define H_someClass
类SomeClass的{市民: 无效SomeFunction(); };
#endif
,为了不要让错误关于重新定义,当u需要在其他文件.cpp文件。
- 1. 什么是头文件和C++中的实现文件?
- 2. 为什么头文件包含完整的代码实现?
- 3. 为什么包含头文件而不是实现?
- 4. 在C++中包含头文件(类定义和方法实现)
- 5. C++头文件包含
- 6. C++头文件包含
- 7. C++包含头文件
- 8. C++包含头文件
- 9. 在类头和实现中包含头文件?
- 10. 为什么包含标准头文件?
- 11. 在其他实现文件中包含实现文件有什么用处?
- 12. 当没有实现文件时包含头文件?
- 13. 如何在纯C和CUDA C文件中包含头文件?
- 14. 当包含不同的头文件时,C实现是否可以隐式地包含标准头文件?
- 15. Objective C头文件实现
- 16. 关键字包含在头文件vs源/实现文件中的C++“规则”
- 17. 包含头文件
- 18. C++实现和头文件链接
- 19. C++单独实现和头文件
- 20. 为什么在方法定义文件中包含头文件?
- 21. 在头文件中包含模板实现cpp文件和链接混淆
- 22. C++头文件和包括
- 23. C++头文件本身不包含依赖文件头
- 24. 为什么我需要在同名的.c文件中包含.h头文件?
- 25. C++ #ifndef用于包含文件,为什么所有头文件都用于头文件?
- 26. 什么框架和头文件包含常量kAudioUnitSubType_RemoteIO
- 27. 使用头文件和实现文件的C++类
- 28. C++头文件/实现文件和重载运算符
- 29. C++头文件包含错误
- 30. C++包含头文件问题
许多模糊包括http://stackoverflow.com/questions/280033/c-header-files-code-separation – 2010-05-22 09:33:55