c0r3ntin:
这很复杂,但并非每天都会发生。这个值可以寻址吗?可以复制吗?可以移动吗?是否应该移动?只有在极少数情况下,您才需要主动澄清和充分了解它们。(模板库编写、热路径等)。大多数时候,C++ 并不比 java 或其他任何东西复杂。可悲的是,大多数人都忘记了这一点。C++ 可能是最复杂的语言,但您可以编写非常好的代码而不必担心细节。大对象 o=getBigObject();
初始化
现在有 18 种方式(从 C++17 开始)!
请参阅:C++ 中的初始化很疯狂;r/cpp 线程
模板(和模板扣除)
当我看到 C++17 的所有变化时,我不知所措;关于模板的太多细节。
同样的事情发生在 C++20 中,我们得到了期待已久的重大改进:概念——它彻底改变了 C++。
但是,如果您想学习模板,一开始可能会不知所措。
ABI
随着新功能列表的不断增长,“从头开始”修复 C++ 设计中的老问题可能是一个诱人的话题。但是这种语言的原则是不破坏旧代码,所以委员会非常严格,不喜欢改变已经引入的特性的路线。
这个问题没有正确的答案,但无论如何,一个充分讨论的话题总比仓促行事要好。
缺乏依赖管理工具
我们可以抱怨 C++ 没有“提供”一个很酷的依赖管理系统。但现实情况是,在可预见的未来,这可能不会发生。拥有一个“标准”包管理器是一个艰难的选择,尤其是因为它必须处理许多可用 C++ 的平台和系统。
不够安全
前段时间,你可以阅读一些提到这个问题的文章(这篇和这篇):
谷歌工程师本周表示c语言文件存在却打不开,Chrome 代码库中大约 70% 的严重安全漏洞是内存管理和安全漏洞。
微软也是如此。由于大部分代码都是 C 或 C++,所以每个人都指责 C++ 不安全。
其他问题?
您使用这种语言的主要问题是什么?
到目前为止,我们已经讨论了一些问题……那么如何处理它们呢?有没有机会解决这些问题?
如何保持清醒
没有完美的编程语言;每种语言都有一些问题。以下是我对如何处理现代 C++ 问题的建议:
保持乐观,语言正在发展
没有人愿意使用旧的语法和结构编写代码。我们已经看到很多关于 C++11 之前的旧版本 C++ 的投诉。人们用了将近 13 年的时间(从主要的 C++98,不包括次要的 C++03) 想出一个新的主要版本:C++11。现在我们可以高兴地回到正轨,事情发生了变化每三年一次。说到底,你不能说你的语言已经死了。
虽然其中一些功能非常庞大,可能会令人困惑或需要更多学习,但现实实际上非常简单:
用户指导
如果您对 C++ 代码的许多方面感到困惑c语言文件存在却打不开,那么您应该查阅 C++ 核心指南。它由热情的 C++ 开发社区创建,主要编辑是 Herb Sutter 和 Bjarne Stroustrup。
看这里:
C++ 核心指南@Github
这是一个漂亮的网站:
C++ 核心指南:网站
只需输入您面临的问题(例如返回值),您就可以轻松找到建议 – 例如:指南:返回值
使用这些指南将为您节省大量时间,并且您可以非常快速地学习一些好的模式。
还有工具!
由于 Clang 和其他平台上开发速度的提高,我们拥有以下工具:
或者查看我关于其他工具的文章:C++ 生态系统:编译器、IDE、工具、测试等
虽然它不如其他语言(主要是基于 Java 或基于 .NET),但它正在变得更好。请记住,由于 C++ 的复杂语法,很难实现动态分析代码的工具。
努力跟上最新动态
C++ 社区非常活跃。有很多博客、书籍、会议……甚至可能是您所在城市的当地社区。
首先,我建议您访问 isocpp.org 查看所有事件/新闻/文章。然后,您可以查看 Meeting C++ 和有关本地 C++ 组的信息。还有 reddit/cpp,在那里你可以看到一些最好的 C++ 故事。
还有 CppCast – 面向 C++ 开发人员的每周播客。
并参考以下书籍:
您还可以查看推荐的 C++ 资源列表:
Bartek 的编程博客:资源
太多细节?
C++ 如此强大的原因之一是它允许您实现非常接近底层的代码。您可以控制所有细节、内存布局、性能优化等……同时,这些功能增加了语言的复杂性。
但是,如果您不需要走那么远,您可以停留在相对较高的抽象级别。
例如,您不需要编写可选类型,因为您可以使用标准库中的 std::optional 。如果您不想处理低级且容易出错的联合类型,您应该意识到 std::variant 是一个安全的选择。
使用你需要的东西
C++ 是一种多范式语言;您可以通过许多不同的方式使用它。最近,我读到一篇有趣的评论,说 Cpp 程序员可以在不涉及模板元编程甚至异常之类的高级内容的情况下继续出类拔萃多年。很大程度上取决于项目的代码风格。
例如,即使像谷歌这样的公司也限制了 C++ 的功能,说他们不使用异常。
如果您不是库开发人员,您可能不会遇到自定义移动运算符或移动构造函数的问题。同样,高级元编程的内容可能不是代码的关键部分。
增量变化
如果您是从头开始或者只有一个小的代码库,那么迁移到 C++11/14 应该相对容易。但是 20 年前(或更长时间!)创建的数百万行代码呢?
一步一步来。
至少对于新代码,您应该开始使用现代 C++。此外,通过应用“侦察规则”,您可以改进您接触到的那些代码。
这可能会导致一些混合代码,但它仍然比保持旧样式更好。
最后的底线:您的旧代码仍然可以编译
C++ 规范越来越大的原因之一是该语言向后兼容。所以委员会通常会引入新功能,但很少会删除旧的东西。所以……你的代码仍然可以编译。如果你不想前进,不想使用新的东西,那么你仍然可以保持当前的风格。
有时您会收到一些关于已弃用内容或已删除功能的警告(例如 C++17 中的 auto_ptr),但即使在这种情况下,您也可以将编译器切换到一些较旧的 C++ 标准。
总结
这篇文章有一些抱怨,也有一些“美化”。我试图找出语言及其演变的各种问题,以及一些改进的积极迹象。虽然我们可以抱怨复杂性、变化速度等,但我认为我们不能说这种语言已经死了。这是一件好事!:)
我认为您不必快速追求新功能并立即重写现有代码。尽量跟上,使用真正改善你工作的特性,你的代码应该逐渐改进并变得更加“现代”(这是可定义的,参见meetingcpp的相关文章)
请登录后发表评论
注册
社交帐号登录