最佳实践:c ++标头包括

时间:2013-06-11 13:49:30

标签: c++ header include

我现在正在学习C ++,而且我认为我理解包含标题的大部分内容......来自完全没有必要的语言,我经常感觉'这​​是错误'或者应该有'更简单的方法来做到这一点':

  1. 我觉得在我想要使用矢量的每个类中包含(例如)“vector”非常烦人。有更好的方法吗?

  2. 我有很多核心功能(也在它的独立命名空间中),有很多不经常更改的类。虽然我不需要每个类中的所有功能,但是只有一个单独的头文件,包含它并完成它将是非常好的...这是最好的方法吗?

  3. 在预编译的头文件中包含标题是不好的做法?如果是,为什么?

4 个答案:

答案 0 :(得分:3)

你感觉{{1}你所需要的,你需要的地方是“错误的”可能来自 - 至少部分 - 来自其他语言的偏见,而这是不必要的。

在C ++中,推动许多范式的理念是,“你不为你不使用或不需要的东西买单。”这表明其中一种方法是需要#include您正在编写的组件所需的任何标题。没有任何内容会自动#include

已经建立了快捷方式,使这更简单。一个这样的捷径就是使用所谓的预编译头文件或全局头文件,它们本身#include所有这些在您的项目中全局使用的低级内容。您可以在需要它的任何文件中编写这样的标题和#include,而不是#include几个(或几十个)单个文件。

在编译时收获“你不支付你不使用的东西”的一个好处。如果你只需要3个小的头文件,#include只有那三个,而不是几十个不需要的文件,将加快编译时间。

答案 1 :(得分:2)

  1. 不是一般但有例外。更多 - 您不应该依赖包含在h文件中的包含,但有时您可以这样做。例如,在派生类中,您几乎可以依赖于基础的包含。
  2. 制作您自己的包含,其中包含一堆其他包含。但要小心。
  3. 对于不经常更改的大型包含,这是一个很好的做法。这在posix系统上也不常见。

答案 2 :(得分:1)

  

1.我觉得在每个我想要使用矢量的类中包含(例如)非常烦人。还有更好的方法吗?

想象一下,对于使用您的代码的其他人(以及其他人可能您未来的自己)有多烦人,并且由于<vector>缺少标头而导致编译错误。写一次,多次使用。

  

2.我有很多核心功能(也在它的独立命名空间中)有很多不经常更改的类。当我   不需要每个类中的所有功能,这将是非常好的   只有一个头文件,包括那个并完成   它...最好的方法是什么?

如果您让IDE自动将其包含在预编译头中,则可以执行此操作以获得加速。但是仅仅为了正确性和可移植性,你不应该依赖它,并且总是让每个标题可以作为独立标题编译。参见例如Alexandrescu & Sutter's编码标准中的第23项。构建像CMake这样的系统甚至都有宏来测试它。

  

3.在预编译头文件中包含标题是不好的做法吗?如果是,为什么?

您可以这样做,但最好让IDE执行此操作以获得更好的可移植性。并且这些标题更稳定(标准库或Boost,例如,但绝不是您自己的项目标题)。

答案 3 :(得分:0)

创建一个common.h头文件。在此包含所有必需的头文件,并将其包含在所有其他头文件中(我不了解其他文件,但我们在项目中遵循这一点。)

包含预编译的头文件是一个很好的做法(你只需要包含几乎没有变化的标题)。但我只在windows c ++中看到了预编译的头文件(stdafx.h),而不是其他任何地方。