C++-C++,在头文件中编写实现代码有什么坏处?
在工程中,经常发现类似xxx_impl.h命名的头文件,里面定义的类就像Java一样直接把函数实现写在类里面,而且没有cpp文件,有人说这样写代码是非常不好的,具体会有哪些坏处啊?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在工程中,经常发现类似xxx_impl.h命名的头文件,里面定义的类就像Java一样直接把函数实现写在类里面,而且没有cpp文件,有人说这样写代码是非常不好的,具体会有哪些坏处啊?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
假如该头文件内实现的函数有个静态变量,然后头文件被多个cpp文件包含,最终每个cpp文件内拥有一个静态变量,它们没办法共享使用那个静态变量
不使用头文件来包含实现,往往是出于以下几种顾虑:
1、暴露了实现细节。
2、头文件被包含到不同的源文件中,会导致链接冲突。
3、头文件被包含到不同的源文件中,会导致有多份实现被编译出来,增大可执行体的体积。
祥见:函数实现不放在头文件的原因,及何时可以放头文件的情况
1 在头文件中编写代码会导致同样的二进制被多个模块反复编译内联,导致程序体积上升
2 头文件中的代码会被很多的cpp文件引用,导致重复编译,导致编译速度下降
3 由于代码被多次编译,在链接时链接器无法正确的理解这些函数的实体导致链接不通过。(除非指定了inline或static,同样不可取,见后续说明)
4 即使强制指定了inline,链接器也无法判定同名函数实体是否具有相同的功能,导致链接器只能任意撇弃实例,这可能导致inline隐藏了代码问题。
5 如果头文件中的函数代码中存在static变量,当这个函数被多个模块链接时,将产生多份static变量实例,从而导致晦涩的程序问题。
C里面一般是不允许把代码直接写在.h文件中的,但是在C++中则完全不一样:
1. 简单的代码鼓励写成inline并放在.h文件中,这样编译器可以将代码直接嵌入调用的部分、进行深层次优化并且减少调用开支。当编译器认为不适合inline时也可以自动处理。类中将实现直接写在类声明中的自动成为inline函数。
2. 模板类必须把代码写在.h中间,因为是到用时才编译的。
事实上现在的C++编译器完全可以自动处理类实现写入.h文件的情况,即使实现的成员函数前面是virtual之类不能inline的类型也不会有问题。最多只是降低编译速度而已。
综合来说最好的选择是复杂的代码写入.cpp,简单的、可以inline的代码写入.h实现成inline。
写入.h文件要考虑的另一个问题是如果你要将程序作为库发布出去,代码写在.h中会泄露你的代码,并可能影响将来的兼容性。
确实,把实现代码放入头文件中通常会导致问题。但大家有没有注意到,楼主的问题里面是这么说的:“类似xxx_impl.h命名的头文件”……
我猜测,在楼主所说的工程里面,如果有头文件 abc_impl.h,就会对应有 abc.h,还有 abc.cpp 这两个文件。而且,包含 abc_impl.h 的文件,只有 abc.cpp。
如果真是这样的话,几位前辈所说的问题,就都不会成为问题了……