C++-C++,在头文件中编写实现代码有什么坏处?

发布于 2016-10-21 11:27:42 字数 97 浏览 1461 评论 5

在工程中,经常发现类似xxx_impl.h命名的头文件,里面定义的类就像Java一样直接把函数实现写在类里面,而且没有cpp文件,有人说这样写代码是非常不好的,具体会有哪些坏处啊?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

瑾兮 2017-10-06 20:58:05

假如该头文件内实现的函数有个静态变量,然后头文件被多个cpp文件包含,最终每个cpp文件内拥有一个静态变量,它们没办法共享使用那个静态变量

想挽留 2017-08-22 23:14:32

不使用头文件来包含实现,往往是出于以下几种顾虑:
1、暴露了实现细节。
2、头文件被包含到不同的源文件中,会导致链接冲突。
3、头文件被包含到不同的源文件中,会导致有多份实现被编译出来,增大可执行体的体积。

祥见:函数实现不放在头文件的原因,及何时可以放头文件的情况

灵芸 2017-06-18 00:58:12

1 在头文件中编写代码会导致同样的二进制被多个模块反复编译内联,导致程序体积上升
2 头文件中的代码会被很多的cpp文件引用,导致重复编译,导致编译速度下降
3 由于代码被多次编译,在链接时链接器无法正确的理解这些函数的实体导致链接不通过。(除非指定了inline或static,同样不可取,见后续说明)
4 即使强制指定了inline,链接器也无法判定同名函数实体是否具有相同的功能,导致链接器只能任意撇弃实例,这可能导致inline隐藏了代码问题。
5 如果头文件中的函数代码中存在static变量,当这个函数被多个模块链接时,将产生多份static变量实例,从而导致晦涩的程序问题。

浮生未歇 2017-04-05 16:08:07

C里面一般是不允许把代码直接写在.h文件中的,但是在C++中则完全不一样:
1. 简单的代码鼓励写成inline并放在.h文件中,这样编译器可以将代码直接嵌入调用的部分、进行深层次优化并且减少调用开支。当编译器认为不适合inline时也可以自动处理。类中将实现直接写在类声明中的自动成为inline函数。
2. 模板类必须把代码写在.h中间,因为是到用时才编译的。

事实上现在的C++编译器完全可以自动处理类实现写入.h文件的情况,即使实现的成员函数前面是virtual之类不能inline的类型也不会有问题。最多只是降低编译速度而已。
综合来说最好的选择是复杂的代码写入.cpp,简单的、可以inline的代码写入.h实现成inline。

写入.h文件要考虑的另一个问题是如果你要将程序作为库发布出去,代码写在.h中会泄露你的代码,并可能影响将来的兼容性。

泛泛之交 2016-12-10 13:49:40

确实,把实现代码放入头文件中通常会导致问题。但大家有没有注意到,楼主的问题里面是这么说的:“类似xxx_impl.h命名的头文件”……

我猜测,在楼主所说的工程里面,如果有头文件 abc_impl.h,就会对应有 abc.h,还有 abc.cpp 这两个文件。而且,包含 abc_impl.h 的文件,只有 abc.cpp。

如果真是这样的话,几位前辈所说的问题,就都不会成为问题了……

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文