繁体   English   中英

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

[英]Why to use .cpp files if I can have all of my C++ code in .h file?

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

原因如下:

(1)增量构建时间

当项目变大时,管理构建时间是有问题的,特别是对于C ++项目。 在一次微小的改变后建立1或5分钟会产生很大的不同。 大型项目的大多数变化很小需要大量测试,这一点得到了强调。 再加上TDD和重构的任何尝试,你是一个用西西里鞋的死slu ..

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

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

// .cpp
static Foo foo;

没有办法(我知道)允许在仅头文件项目中使用它。 编译器特定的解决方案是有限的,例如MSVC中的__declspec(selectany)仅限于POD类型。

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

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


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

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

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

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

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

那就是风格。 这对我来说只是看错了。 但这是一个偏好问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM