你的同事是错误的,通常的方式是把代码放在 .cpp 文件(或任何你喜欢的扩展名)中,把声明放在头文件中。
有时把代码放在头文件中的确有一些优点,这可以让编译器更聪明地内联。但与此同时,它也可能破坏你的编译时间,因为每次编译器包含代码时都必须处理所有代码。
最后,当所有代码都在头文件中时,循环对象关系(有时是期望的)经常会成为问题。
总之,你是正确的,他是错误的。
编辑:我考虑了你的问题。有一个情况是他说的是对的。模板。许多新的“现代”库如 boost 等大量使用模板,并且通常是“仅头文件”。然而,只有处理模板时才应该这样做,因为这是处理它们的唯一方法。
编辑:有些人想要更多的澄清,下面是有关编写“仅头文件”的缺点的一些想法:
如果你搜索一下,你会发现很多人试图找到一种减少处理 boost 时编译时间的方法。例如:如何通过 Boost Asio 减少编译时间,其中一个包含 boost 的单个 1K 文件的编译需要 14 秒。14 秒可能并不会爆炸,但它肯定比典型值要长得多,并且在处理大型项目时可以快速累积。仅头文件库确实以相当可测量的方式影响编译时间。我们只是容忍了它,因为 boost 很有用。
此外,有许多事情在头文件中无法完成(即使boost也需要链接到某些库,如线程、文件系统等的某些部分)。一个主要的例子是,在仅限头文件的库中无法使用简单的全局对象(除非您采用单例模式这样的可怕方法),否则会遇到多次定义错误。 注意:C++17中的内联变量将使未来可以实现此特定示例。
最后一点,当将boost作为仅限头文件代码的示例时,通常会忽略一个重要细节。
Boost是一个库,而不是用户级别的代码。因此,它不经常更改。在用户代码中,如果你把所有东西都放在头文件中,每个小改动都会导致你不得不重新编译整个项目。这是一种巨大的时间浪费(对于不会从一个编译到另一个编译发生变化的库而言不是这种情况)。当您将事物分割在头文件/源文件之间,并更好地使用前向声明以减少包含,您可以节省数小时的重新编译时间,这在一天内增加起来非常可观。