为什么使用C ++库如此复杂?


14

首先,我想指出的是,我热爱C ++,并且我是认为C ++比Java编写容易的人之一。除了一件小事:库。

在Java中,您只需将一些jar添加到构建路径即可。

在C ++中,通常必须为头文件和库本身设置多个路径。在某些情况下,您甚至必须使用特殊的构建标志。我主要使用Visual Studio,代码块,而根本没有使用IDE。在谈论使用外部库时,所有这三个选项没有太大差异。

我不知道为什么没有比这更简单的选择了?就像拥有一个特殊的.zip文件一样,它可以将您需要的所有东西都放在一个地方,因此IDE可以为您设置构建标志进行所有工作。有没有技术上的障碍?

Answers:


15

C ++旨在通过支持面向对象编程来简化,自动化程度更高的语言来改进C语言。但是它并没有改变或改善C处理外部库和头文件的方式。C ++没有像更现代的语言那样的模块系统-它仍然使用C预处理器和链接器系统。由于C ++的既定目标之一是与C代码的向后兼容性,因此这并不奇怪。任何C ++模块系统都必须与旧的C头文件/链接器系统一起工作。C ++标准委员会只是没有去设计一个更现代的模块系统。(尽管他们正在努力,请参阅下面的Klaim评论。)


8
最后一行并不完全正确:模块系统自2004年以来一直在工作(第一个文档),但隐含着太多的工作,以至于对于最后的标准甚至无法真正设想到,因为这样会缺乏实施支持该提案。该实现已在wortk中(连同其他草案一起使用)来设计下一个C ++标准。并不是说它不是C ++设计人员的优先事项,这只是您不能出错的功能之一,必须保持逆向兼容性(与大多数C代码和C ++ 11兼容),并且很难正确地做到这一点。因此需要很多时间。
克拉姆

太棒了 谢谢克莱姆(Klaim)的信息。一定会检查出来的。这非常令人兴奋:)
Pijusn

大多数语言都没有标准化链接的业务,因为该机制在操作系统之间可能会有所不同。Java的“随处可见”性质要求强制特定的链接和库格式。这没有什么错,但是它带来了一些开销,在所有情况下可能都是不希望的。
Blrfl

坦白说,我很震惊地读到C ++标准委员会正在为该语言本身的模块系统工作。C ++已经是一门庞大而复杂的语言,尝试向其添加这种敏感功能可能会带来很大的风险。如下面的Karl Bielefeldt所述,这个问题已经在平台级别(Linux软件包系统)上并且大多数IDE可以很轻松地解决。例如,看看Qt库和Qt Creator如何处理此问题。
AlexBottoni

1
@AlexBottoni,我真的很怀疑他们在本世纪任何时候都不会提出标准化的模块系统。他们甚至没有在C ++ 11中包含概念,因为他们无法就精确的实现达成共识。与标头/链接器系统一起工作的模块系统更加棘手,而且我们可能很长一段时间都不会看到它。
查尔斯·萨尔维亚

2

这不是技术障碍。在Linux上,“特殊zip文件”是使用软件包管理器安装的library-dev软件包,设置include和linker标志就像configure.ac在使用pkg-config进行设置的几行代码中一样简单。

Pkg-config也可用于Windows,但是文化障碍阻碍了它的广泛采用。Unix一直具有通过分发源代码来实现可移植性的悠久历史,因此它们包括免费的开发工具。Windows具有鼓励仅二进制分发并向开发人员收费的工具的悠久历史。当您靠出售图书馆赚钱时,让第三方更轻松地提供它们是没有意义的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.