发布于 2026-01-06 7 阅读
0

为 C++ DEV 的全球展示挑战赛辩护,该挑战赛由 Mux 赞助:展示你的项目!

为 C++ 辩护

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

C++的声誉

C++ 经常因其复杂性、陡峭的学习曲线以及最主要的缺点而受到批评,即它不仅会让开发者搬起石头砸自己的脚,甚至可能让他们付出惨痛的代价。但这些批评经得起推敲吗?

在这篇博文中,我旨在探讨一些对 C++ 最常见的批评,并对其优点和缺点提供一个平衡的视角。

C++ 很“复杂”。

C++ 的确是一门复杂的语言,拥有极其丰富的特性和功能。在 C++ 中,任何你想实现的功能,都有大约十几种不同的实现方式,每种方式都有其自身的优缺点和影响。那么,作为一名开发者,你如何才能知道哪种方法最适合你的特定用例呢?当然,你必须对这门语言有深入的了解才能做出这些决定,对吗?

其实不然……我的意思是,别误会,它当然有帮助,但并非硬性要求。过早优化是万恶之源,而在 C++ 中,你完全可以编写出优秀的代码,而无需担心语言中那些更复杂的特性。你可以用 C++ 编写出简洁、易读且易于维护的代码,而无需使用模板、运算符重载或任何其他更高级的语言特性。

有一种观点认为,无论使用哪种编程语言,你都必须采用最高效、最正确的方法。Python 有其独特的 Pythonic 风格,Java 有,C# 有,Go 也有。甚至连在浏览器上绘制 HTML 这样简单的操作,每隔几年都需要重新发明轮子,并引发无休止的争论。然而,事实是,在大多数情况下,并不存在唯一正确的方法。所谓的“最佳方法”往往只是个人或团队的偏好。认为只要以“最佳”且正确的方式编写代码,就永远不用担心维护问题的想法是完全错误的。

别太纠结于使用“最佳”方法;更应该关注如何编写易于阅读和理解的代码。如果你做到了这一点,就没问题了。

C++ 已经“过时”了

C++ 的确非常古老,它诞生于 1985 年。为了更直观地说明这一点,我们不妨看看,这比 Windows 的第一个版本发布早了 4 年,比 Linux 的第一个版本发布早了 6 年,甚至比最后一台 8 位计算机的发布时间还要早。所以,无论从哪个角度来看,C++ 的确相当古老。但这是否意味着它已经过时了呢?

当然不是,C++ 自 1985 年发布以来就一直停滞不前。40 多年来,C++ 一直在积极开发和改进,不断添加新的特性和功能。最新的 C++ 标准版本 C++20 于 2020 年发布,为该语言引入了许多新特性和改进。C++23 也即将面世,预计将为该语言带来更多改进。

这些改进的关键在于模块、概念、范围和协程。这些特性将现代编程范式引入 C++,使其比以往任何时候都更加强大和富有表现力。

但是戴夫,我们所说的过时是指其他语言已经超越了 C++,并提供了更好的开发者体验。

我想这纯粹是个人喜好问题。C++ 仍然是使用最广泛的编程语言之一,拥有庞大的库和工具生态系统。它的应用范围非常广泛,从游戏开发到高性能计算再到嵌入式系统,无所不包。世界上许多最流行、最常用的软件应用都是用 C++ 编写的。

我完全不认为 C++ 已经过时;要得出这样的结论,你必须对“过时”的定义做出相当大的曲解。

C++ 是不安全的

啊,终于到了最重要的部分,是的,我会将它与 Rust 进行比较,因为 Rust 是一种“内存安全”的语言,很多人声称它将取代或应该取代 C++。

事实上,我们现在就来把最重要的一点说清楚。

将 C++ 代码库重写为 Rust 总是能产生比以前更内存安全的结果。

无数公司都表示,他们通过简单地用 Rust 重写 C++ 代码库,提高了安全性,减少了报告的错误或内存泄漏的数量。

这都是因为 Rust 吗?我认为部分原因是肯定的。但是,我认为最主要的原因是,任何对现有代码库的重写都会比原始代码库产生更好的结果。

重写代码库时,您有机会重新思考和设计架构,修复错误,并提升代码的整体质量。您可以充分利用之前实现中汲取的所有经验教训,以及所有已发现并修复的问题,这些您早已熟知。所有在现有代码库中难以解决的棘手问题,都可以在新代码库中轻松解决。

想象一下,你盖了个棚子,它有点摇晃,而且你当初盖的时候对木工榫卯结构不太了解,所以它还有一些其他问题,比如结构不稳、屋顶漏水。几年后,你又盖了个新的,这次你知道了第一次犯的所有错误,所以盖得更好、更结实、更防风雨。在这个过程中,你决定更换之前用的材料,比如说,你不再用枫木,而是用了橡木。那么,新棚子之所以更好,仅仅是因为你用了橡木而不是枫木吗?或者说,这只是整体改进中很小的一部分?

每当我看到这些公司声称用 Rust 重写 C++ 代码库后,代码的内存安全性就提高了,我都会有这种感觉。这并非 Rust 的功劳,而是因为他们花时间重新思考和设计了代码库,并吸取了之前实现中的所有经验教训。

但这并不否认 C++ 是不安全的事实。

是的,如果你不了解自己在做什么,C++ 可能会不安全。但关键在于:如果你不了解自己在做什么,所有编程语言都是不安全的。你可以用 Rust 写出不安全的代码,你可以用 Python 写出不安全的代码,你也可以用 JavaScript 写出不安全的代码。

内存安全只是编程语言安全性的一个方面;即使是内存安全的编程语言,你仍然可以编写不安全的代码。仅仅使用 Rust 并不能神奇地保证你的应用程序安全;它只是大大降低了出现内存泄漏或其他安全问题的概率。

在这个语境下,“不安全”这个词有点太模糊了,我认为它被用作一个包罗万象的术语,这在我看来充满了营销术语的味道。

能否让 C++ 更安全?

是的,C++ 可以变得更安全;事实上,它甚至可以做到内存安全。有很多库和工具可以帮助提高 C++ 代码的安全性,例如智能指针、静态分析工具和内存清理器。甚至,如果你真的想的话,你还可以给 C++ 添加垃圾回收器(但请不要这样做)。

但让 C++ 更安全最简单直接的方法就是学习智能指针,并在必要时使用它们。智能指针是一种在 C++ 中管理内存的方法,无需手动分配和释放内存。它们会自动处理内存管理,从而大大降低内存泄漏或悬空指针的风险。这正是 C++ 最初受到诟病的主要原因。

C++ 很难读懂

那就别那样写。C++ 是一种多范式编程语言;你可以编写过程式代码、面向对象代码、函数式代码,或者三者的混合。如果你愿意,你可以用 C++ 编写简洁易读的代码。当然,如果你愿意,你也可以用 C++ 编写复杂难读的代码。这完全取决于个人或团队的偏好。

我写 C++ 代码时喜欢遵循一条经验法则:尽可能让它看起来像 C 语言,除非真的必要,否则避免使用太多高级特性。使用智能指针,避免使用原始指针,并尽可能使用标准库。

你可以像使用 C 语言一样使用 C++ 来完成大量的编程工作,只有在真正需要的时候才引入复杂性。

但这岂不是完全违背了C++的初衷吗?那为什么不直接用C语言呢?

C++ 是 C 的超集,你可以用 C++ 编写 C 代码,而且完全可以正常运行。C++ 在 C 的基础上添加了许多特性和功能。如果你一开始就学习 C,那么你就只能使用 C,这在很多情况下也没什么问题,别误会我的意思。但是 C++ 让你可以在需要的时候使用更高级的语言特性。你可以先学习 C,然后根据需要逐步引入 C++ 的特性。如果你不想使用 C++ 的所有特性,完全没问题。

再说回我之前提到的棚子,如果你用木头建了一个棚子,以后需要的话,随时可以加装金属屋顶。你完全可以不用把整个棚子都用金属材料来建。

C++ 的生态系统十分复杂。

C++ 拥有一个庞大的生态系统,历经四十余年的发展,积累了大量的库和工具。这使得开发者难以确定针对特定任务应该使用哪些库和工具。但这并非 C++ 独有的问题;几乎所有编程语言都面临着类似的困境。

再次强调,最简单的原则是尽可能使用标准库;它维护良好,功能强大。对于网络或 GUI 开发等其他任务,也有许多知名的库可供选择,它们应用广泛且维护良好。建议您做一些研究,找出最适合您特定用例的库。

尽量避免使用 Boost。Boost是一个庞大的库集合,在 C++ 社区中被广泛使用。然而,Boost 中的许多库已经过时,不再维护。它们通常也相当复杂难用。如果可以,请尽量避免使用 Boost。

除非你正在编写一个大型且复杂的应用程序,需要 Boost 提供的特定功能,否则最好使用其他更现代、更易于使用的库。除非确实必要,否则不要给你的应用程序增加 Boost 带来的性能开销和二进制文件体积膨胀。

C++对于初学者来说不是一个好的选择。

编程、木工和汽车修理都不适合初学者。编程很难,学习编程需要时间和精力,就像学习其他任何事物一样。没有一种语言真正适合初学者,任何事物都有其优缺点。

事实上,如果你想从事系统编程或游戏开发之类的工作,那么从 Python 或 JavaScript 入手并不会对你帮助太大。你最终还是需要学习 C 或 C++。

如果你想成为一名网页开发人员或数据科学家,那就从 Python 或 JavaScript 开始学习吧。

如果你只是想在编程行业找份工作,我不知道,那就学习 Java 或 C# 吧,这两种语言都很棒,虽然经常受到不应有的诋毁,但它们提供了很多就业机会。

听着,关键在于:如果你刚开始学习编程,无论你选择哪种语言,都会很困难。我甚至认为,从 C 或 C++ 入手远比从那些晦涩难懂、难以理解编程底层概念的语言入手要好得多。我还要进一步指出,从 Python 或 JavaScript 入手从长远来看对你不利,因为你舍弃了在对某个概念理解还很新鲜、易于掌握的时候学习新知识的痛苦,而换来了以后学习新知识时所承受的痛苦,那时你已经对编程有了更深的理解。

不过,这只是我个人的看法。

C++ 与 Rust:朋友还是对手?

近年来,Rust 备受青睐,这并非没有道理。它非常重视内存安全,其借用检查机制能够有效约束代码,而 C++ 通常将这一责任留给程序员。尽管如此,Rust 的生态系统仍在不断完善,学习曲线也可能同样陡峭——只是方式有所不同。C++ 或许无法完全避免你犯错,但它提供了数十年来久经考验的工具、编译器和库,这​​些工具、编译器和库为从 Chrome 到 Unreal Engine 等各种应用提供支持。实际上,许多团队会将 Rust 和 C++ 结合使用,而不是将它们视为对立面。Rust 在以安全为首要任务的新项目中表现出色,而 C++ 则继续在遗留系统和对性能要求极高的领域占据主导地位。

2025年C++还会被使用吗?

简而言之:当然。尽管人们不断议论 C++ 已经过时,但它仍然是世界上使用最广泛的语言之一。Chrome 和 Firefox 等主流浏览器仍然使用 C++ 编写。Unreal 等游戏引擎也基于 C++ 运行。汽车系统、金融交易平台,甚至人工智能框架都高度依赖 C++ 来实现性能和控制。新的标准(C++20、C++23)不断更新 C++,确保它能够与新兴语言保持竞争力。如果你深入了解我们日常使用的大多数大型系统,几乎总能在底层发现 C++ 的身影。

结论

C++ 是一种功能强大且用途广泛的编程语言,经受住了时间的考验。尽管它确实存在一些复杂性和挑战,但在当今的科技领域,它仍然是一种重要且广泛使用的语言。
只要方法得当,C++ 就能带来愉悦的开发体验,并能构建高性能、高效率的应用程序。因此,下次当你听到有人批评 C++ 时,不妨花点时间了解一下这门历史悠久的语言的优势和功能,然后再决定是否断然否定它。

希望您喜欢这篇博文。如果您喜欢,请考虑与您的朋友和同事分享。如果您有任何问题或评论,欢迎随时在Twitter上联系我

文章来源:https://dev.to/dayvster/in-defense-of-c-1g7l