您的同事是错误的,通常的方法是一直将代码放在.cpp文件(或您喜欢的任何扩展名)中,并将声明放在标头中。
有时将代码放入标头中有一些好处,这可以使编译器进行更巧妙的内联。但是同时,由于每次编译器都必须处理所有代码时,它可能会破坏编译时间。
最后,当所有代码都是头文件时,具有循环对象关系(有时是理想的)通常很烦人。
底线,你是对的,他是错的。
编辑:我一直在想你的问题。在一种情况下,他说的是真的。模板。许多新的“现代”库(例如boost)都大量使用模板,并且常常是“仅标头”。但是,仅应在处理模板时执行此操作,因为这是处理模板时的唯一方法。
编辑:有些人想要更多的说明,这是编写“仅标头”代码的缺点:
如果四处搜寻,您会发现很多人都在尝试寻找一种方法来减少处理boost的编译时间。例如:如何使用Boost Asio减少编译时间,这将看到包含boost的单个1K文件的14s编译。14s似乎没有“爆炸性”,但肯定比典型的要长得多,并且累积起来很快。处理大型项目时。仅标头的库确实以相当可衡量的方式影响编译时间。我们只是容忍它,因为升压非常有用。
此外,还有很多事情不能仅在标头中完成(即使boost具有某些线程,文件系统等某些部分都需要链接的库)。一个主要的例子是,您不能在仅标头的lib中拥有简单的全局对象(除非您诉诸于单例的可憎),否则会遇到多个定义错误。注意: C ++ 17的内联变量将使该特定示例在将来可行。
最后一点,当使用boost作为仅标头代码的示例时,经常会遗漏大量细节。
Boost是库,而不是用户级代码。因此它不会经常改变。在用户代码中,如果将所有内容放在标头中,则每个小的更改都将导致您不得不重新编译整个项目。这是巨大的时间浪费(对于不从编译到编译不变的库而言,情况并非如此)。当您在标头/源和更好之间进行拆分时,使用前向声明减少包含,可以在一整天的总和中节省重新编译的时间。