![](/img/trans.png)
[英]C++: I have this config class that I want to use between all my CPP files, how do I initialize it?
[英]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.