如果我可以在.h文件中包含所有C ++代码,为什么要使用.cpp文件?我的意思是.cpp文件是很奇怪的,如果所有代码都可以在.h文件中写入?任何一个人都可以干得好吗?
答案 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文件的每个翻译单元中。这使得将代码分成可以单独研究和开发的小部分就无法实现。