2

我现在正在学习 C++,我想我了解大部分关于包括标题的知识......来自根本没有必要的语言,我经常觉得“这是错误的”或应该有“一种更简单的方法来做到这一点”:

  1. 我发现在我想使用向量的每个类中包含(例如)“向量”非常烦人。有没有更好的办法?

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

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

4

4 回答 4

3

你认为#include你需要的东西,你需要它的地方是“错误的”,这可能来自——至少部分地——你的偏见来自其他不必要的语言。

在 C++ 中,驱动许多范例的哲学是,“你不需要为你不使用或不需要的东西付费”。这种体现的方式之一是#include需要您正在编写的组件所需的任何标头。没有什么是#include自动编辑的。

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

“你不用为你不使用的东西付费”理念的好处之一是在编译时获得的。如果你只需要 3 个小头文件,#include只需要这三个而不是几十个不需要的文件,将加快编译时间。

于 2013-06-11T14:01:11.403 回答
2
  1. 不是一般情况,但也有例外。更重要的是——你不应该依赖包含在 h 文件中的包含,但有时你可以这样做。例如,在派生类中,您几乎可以依赖基类的包含。
  2. 制作自己的包含,其中只包含一堆其他包含。但要小心。
  3. 对于不经常更改的大量包含,这是一个很好的做法。这在 posix 系统上也不是很常见的做法。
于 2013-06-11T13:57:02.370 回答
1

1.我发现在我想使用向量的每个类中都包含(例如)非常烦人。有没有更好的办法?

想象一下,对于使用您的代码的其他人(而其他人可能是您未来的自己)并因为缺少<vector>. 一次编写,多次使用。

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

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

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

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

于 2013-06-11T14:03:02.567 回答
0

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

包含预编译的头文件是一个很好的做法(您必须只包含几乎不会更改的头文件)。但是我只在 windows c++ 中看到了预编译的头文件(stdafx.h),在其他任何地方都没有。

于 2013-06-11T14:00:23.300 回答