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