以往自己写代码,都是将函数声明、类声明和定义等写到 .h文件,将函数定义、类实现等写到 .cpp 文件。最近发现很多开源库(比如 boost) 都以 .hpp 文件(s) 的形式分发,即将声明、定义、实现等都写到一个 .hpp 文件,用户在调用的时候只要 include 对应的 .hpp 文件就行了。使用 .hpp 这种代码组织方式有很多好处,例如balabalabalabala......但是写成这种代码组织方式需要遵守一些规则,例如balabalabalabala......
模板类要求将类的定义和实现放在同一个文件,理所当然的写在一个 .hpp 文件就好了,可是非模板的类的定义和实现可以放在一个 .hpp 里吗?思考了下代码的预编译、编译、汇编、链接这个过程,总觉得链接会出问题🤔。于是自己写了些测试代码实验了下,果然有可能会出现在链接的时候提示符号重定义的问题。之所以说有可能会出现呢,是因为这种情况是可以避免的。实验过程的代码不放了,直接写出我得到的结论。
如果类的所有成员函数是内联的,可以组织成 .hpp 的形式,也可以组织成 .cpp + .h的形式。如果类的成员函数不是全部内联的,只能组织成 .cpp + .h 的形式。反过来说,如果要将代码组织成 .hpp 的形式的话,要将类的成员函数都写成内联的(PS: 偶然发现一种莫名喜感的方法,就是将非模板的类包装成模板类,然后用 typedef 导出一个好看点的别名🤭)。
网友评论