3

我正在开发一个 C++ 库。它让我想到了 Java 和 C# 处理包括库的不同组件的方式。例如,Java 使用“import”来允许使用来自其他包的类,而 C# 只是使用“using”来导入整个模块。

我的问题是,将库中的所有内容#include 到一个大型包含中然后只使用 using 指令来导入特定的类和模块是一个好主意吗?或者这会变得很疯狂吗?

编辑: 到目前为止反应良好,这里有一些缓解因素,我觉得这些因素会增加这个想法:

1)内部#includes 保持正常(简短而重要)
2)包含所有内容的文件可以选择与库一起提供给希望使用它的人
3)您可以选择将大包含文件作为 pre 的一部分- 编译的头文件

4

5 回答 5

5

您混淆了#includeC++ 中语句的目的。它们的行为不像 Java 中的 import 语句或 C# 中的 using 语句。#include言行一致;即,加载并解析整个指示文件作为当前翻译单元的一部分。单独包含的原因是不必花费编译时间来解析每个文件中的整个标准库。相比之下,您试图做出的陈述#include只是出于程序员组织的目的。

#include用于管理编译过程;不用于分离用途。(事实上​​,您不能使用单独的标头来强制单独使用,因为这样做会违反单一定义规则)

tl;dr -> 不,你不应该那样做。#include尽可能少。当你的项目变大时,你会感谢自己不用等待很多时间来编译你的项目。

于 2011-03-01T05:24:29.263 回答
2

我个人建议仅在您需要它们以明确显示您的文件需要哪些功能时才包含标题。同时,这样做会阻止您访问您可能不需要的功能,例如与文件目标无关的功能。当然,这没什么大不了的,但我认为当您无法访问不必要的函数/类时,维护和更改代码会更容易;它只是让它更简单。

于 2011-03-01T05:15:15.347 回答
1

我可能会因此而被否决,但我认为你提出了一个有趣的想法。它可能会减慢编译速度,但我认为这个概念很简洁。

只要您using谨慎地使用——仅用于您需要的命名空间——其他开发人员将能够通过浏览顶部来了解文件中使用了哪些类。它不会像查看#included 文件列表那样精细,但是查看包含的头文件列表真的很有用吗?我不这么认为。

当然,只要确保所有头文件都使用包含保护。:)

于 2011-03-01T05:19:37.247 回答
0

正如@Billy ONeal 所说,主要的是#include 是一个预处理器指令,它导致代码的“^C,^V”(复制粘贴)导致编译时间增加。

C++ 中考虑得最好的策略是在“.h”文件中前向声明所有可能的类,并将它们包含在“.cpp”文件中。它隔离了依赖关系,因为如果依赖包含文件发生更改,C/C++ 项目将被级联重建。

当然,M$ 编译器及其预编译的头文件往往会做相反的事情,包含您的建议。但是任何试图在这些编译器之间移植代码的人都清楚它有多臭。

Qt 等一些库广泛使用前向声明。看看它,看看你是否喜欢它的味道。

于 2011-03-01T17:51:43.630 回答
0

我认为这会令人困惑。当你编写 C++ 时,你应该避免让它看起来像 Java 或 C#(或 C :-)。我真的很想知道你为什么这样做。

提供一个包含所有文件也不是很有帮助,因为用户可以很容易地自己创建一个包含实际使用的库的部分的文件。然后可以添加到预编译的标头(如果使用)。

于 2011-03-01T18:38:19.133 回答