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

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

瑾兮 发布于 2016-10-21 字数 170 浏览 1298 回复 5

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

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(5

瑾兮 2017-10-06 5 楼

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

想挽留 2017-08-22 4 楼

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

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

灵芸 2017-06-18 3 楼

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

浮生未歇 2017-04-05 2 楼

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

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

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

泛泛之交 2016-12-10 1 楼

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

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

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