如果我可以在.h文件中包含所有C ++代码,为什么要使用.cpp文件?

时间:2010-12-25 17:40:35

标签: c++ oop header

如果我可以在.h文件中包含所有C ++代码,为什么要使用.cpp文件?我的意思是.cpp文件是很奇怪的,如果所有代码都可以在.h文件中写入?任何一个人都可以干得好吗?

3 个答案:

答案 0 :(得分:8)

有几个原因:

(1)增量构建时间

当项目变大时,管理构建时间是有问题的,特别是对于C ++项目。在一次微小的改变后建立1或5分钟会产生很大的不同。大型项目中的大多数更改都强调了这一点需要大量测试。除此之外,还有TDD和重构的任何尝试,而且你是一个穿着西西里鞋的人。

分割成标题和正文,并将其移动到库可以极大地改善增量构建时间。

(2)静力学
对于许多事情,您需要一个类型的单个实例,即

// .cpp
static Foo foo;

在一个仅限标题的项目中,没有办法(我知道)允许这样做。编译器特定解决方案是有限的,例如MSVC中的__declspec(selectany)仅限于POD类型。

[edit] C ++ 17现在也允许内联进行变量初始化,因此这不再是阻塞问题。

(3)实施隐藏
.cpp / .h分离是将公共接口与实现细节明确分开的唯一方法。您可以将类成员放入private部分,但这对其他实体不起作用。 (即使标题/正文分离是泄漏的,除非你添加其他技术,如PIMPL,所以这个论点有点弱IMO,但同样,在一个大型项目中,我非常怀念这种有效的,如果不完美的方法)。


很棒的问题,无论如何 - 你已经认识到与C / C ++构建模型存在某种冲突,我认为这是一个可怕含义的古老遗物。

您应该尝试在多大程度上推送“仅标题”模型(或者至少是“几乎只有标题”,以允许静态)。你可能会走得很远 - 听到那些尝试过的人会很有意思。

尝试使用静态库来分离和封装实现,以及将所有代码保存在头文件中可能是值得的。我可以看到一些问题,但我们目前的运作方式是无故障的。

答案 1 :(得分:3)

可以将所有代码放入.h文件中。与流行的看法相反,这不会复制.obj文件中的代码。现代编译器比这更聪明。

编译虽然有些问题。如果你有20个.h文件全部包含在main.cpp中,编译main.cpp将需要一段时间。每当您的一个包含文件发生更改时,它将被重新编译,包括所有20个实现.h文件。

然后是风格。它对我来说只是看错了。但这是一个偏好的问题。

然后有参考。如果ClassA使用ClassB,而ClassB使用ClassA,那么首先包含哪一个?

答案 2 :(得分:2)

头文件(.h)用于定义接口,以便您的类和代码可以在其他翻译单元中使用。如果将实现放在.h文件中,那么最终会得到相同代码的多个副本,并编译到包含该.h文件的每个翻译单元中。这使得将代码分成可以单独研究和开发的小部分就无法实现。