我现在正在学习C ++,而且我认为我理解包含标题的大部分内容......来自完全没有必要的语言,我经常感觉'这是错误'或者应该有'更简单的方法来做到这一点':
我觉得在我想要使用矢量的每个类中包含(例如)“vector”非常烦人。有更好的方法吗?
我有很多核心功能(也在它的独立命名空间中),有很多不经常更改的类。虽然我不需要每个类中的所有功能,但是只有一个单独的头文件,包含它并完成它将是非常好的...这是最好的方法吗?
在预编译的头文件中包含标题是不好的做法?如果是,为什么?
答案 0 :(得分:3)
你感觉{{1}你所需要的,你需要的地方是“错误的”可能来自 - 至少部分 - 来自其他语言的偏见,而这是不必要的。
在C ++中,推动许多范式的理念是,“你不为你不使用或不需要的东西买单。”这表明其中一种方法是需要#include
您正在编写的组件所需的任何标题。没有任何内容会自动#include
。
已经建立了快捷方式,使这更简单。一个这样的捷径就是使用所谓的预编译头文件或全局头文件,它们本身#include
所有这些在您的项目中全局使用的低级内容。您可以在需要它的任何文件中编写这样的标题和#include
,而不是#include
几个(或几十个)单个文件。
在编译时收获“你不支付你不使用的东西”的一个好处。如果你只需要3个小的头文件,#include
只有那三个,而不是几十个不需要的文件,将加快编译时间。
答案 1 :(得分:2)
答案 2 :(得分:1)
1.我觉得在每个我想要使用矢量的类中包含(例如)非常烦人。还有更好的方法吗?
想象一下,对于使用您的代码的其他人(以及其他人可能您未来的自己)有多烦人,并且由于<vector>
缺少标头而导致编译错误。写一次,多次使用。
2.我有很多核心功能(也在它的独立命名空间中)有很多不经常更改的类。当我 不需要每个类中的所有功能,这将是非常好的 只有一个头文件,包括那个并完成 它...最好的方法是什么?
如果您让IDE自动将其包含在预编译头中,则可以执行此操作以获得加速。但是仅仅为了正确性和可移植性,你不应该依赖它,并且总是让每个标题可以作为独立标题编译。参见例如Alexandrescu & Sutter's编码标准中的第23项。构建像CMake这样的系统甚至都有宏来测试它。
3.在预编译头文件中包含标题是不好的做法吗?如果是,为什么?
您可以这样做,但最好让IDE执行此操作以获得更好的可移植性。并且这些标题更稳定(标准库或Boost,例如,但绝不是您自己的项目标题)。
答案 3 :(得分:0)
创建一个common.h头文件。在此包含所有必需的头文件,并将其包含在所有其他头文件中(我不了解其他文件,但我们在项目中遵循这一点。)
包含预编译的头文件是一个很好的做法(你只需要包含几乎没有变化的标题)。但我只在windows c ++中看到了预编译的头文件(stdafx.h),而不是其他任何地方。