C++实用指南

时间:2022-10-09 17:39:33 | 浏览:367

C++发展得非常快!例如,C++标准的页数从 C++98/03 的 879 页增加到了 C++20 的 1834 页,多了近 1000 页!更重要的是,C++每次修订后,我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗?如何

C++发展得非常快!例如,C++标准的页数从 C++98/03 的 879 页增加到了 C++20 的 1834 页,多了近 1000 页!更重要的是,C++每次修订后,我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗?如何在当今的 C++世界中保持理智?

介绍

你可能知道 C++是一种复杂的语言。我甚至发现了一整页Wiki是讲对 Cpp 的批判的。现代 C++甚至为生态添加了更多内容。

以下是我之前提到的规范页数的完整数据:

    C++98/03-879,N1905,2005 年 10 月

    C++11-1324,最后草案,N3337,2012 年 1 月

    C++14-1368,最后草案,2014 年 11 月

    C++17-1586,草案,N4606

    C++20-1834,草案,N4861

看起来 C++17 几乎比 C++98/03“大”了 80%,而 C++的最新草案比 C++03 多了将近 1000 页。你可以抱怨增加的这些复杂性,想学好所有这些东西也很困难。但这有那么可怕吗?面对这样的情况,你能做些什么?

首先,我们来看看你在 C++中可能会遇到的一些问题。

一些问题

仅举几例:

    节奏太慢

    节奏太快

    特性的混乱/复杂性

    编译时间慢

    缺乏依赖管理

我们来仔细研究一下。

节奏太慢

2017 年,我们迎来 C++17。虽然每三年就迎来一个新标准是很棒的,但许多开发人员抱怨新版本并不是每个人都期待的。

很多特性:比如概念(concept)、模块、范围(range)、协程(co-routine)……都没有被接受,我们至少需要再等三年才能让它们进入规范。

在 2020 年,C++20 已经准备就绪,并且这些重要特性将随编译器一起提供!但我们还是会抱怨合约(contract)还没加进来,反射(reflection)、执行器(executor)或网络(networking)仍在讨论中。它们可能出现在 C++23 甚至更高版本中。

看起来有些特性接受起来比较慢……而且总有东西值得抱怨。

节奏太快

像往常一样,我们在这里可能有两种相互矛盾的意见。尽管对某些人来说升级节奏很慢,但对其他人来说却很难跟上变化。

你刚刚学习了 C++11/14……现在你就需要更新 C++17 的知识,然后 C++20 就在路上了。三年并不是那么短的时间,但请记住,编译器一致性、公司政策、团队指南可能会以不同的节奏前进。

你的公司是立即更新到最新的 C++版本还是等待几年?

特性的混淆/复杂性

只需阅读这条评论:

CallMeDonk:

我喜欢 C++。这是我的首选语言,但你必须承认,它对值类的“大杂烩”实现是很怪异的。包括我在内的大多数程序员更喜欢简单的、定义明确的语言结构,而不是奇怪和复杂的语法。


C++在各个方面都很清晰吗?可能不是……

以下是一些可能难以理解并可能让程序员糊涂的主题:

移动语义

移动语义的原则非常明确:不要复制,而是尝试“窃取”托管资源的内部结构,你应该获得不错的性能提升。但魔鬼都藏在细节中。

我不会写很多通用代码,所以幸运的是,我不必一直考虑移动语义。但是,当我遇到 move 和 const 时会很困惑——请参阅我上一篇关于该主题的文章。我不相信所有 C++开发人员都会理解这里的规则。特别是你现在需要记住编译器生成的六个默认操作:默认构造器、析构函数、复制构造器、移动构造器、赋值运算符和移动赋值运算符。

Rvalues/xvalues/prvalues……myValues、fooValues

最后一个是我编的……但那么多值类别实在太让人头疼了!

在 C(或 C++98/03)中,你只需要知道左值与右值,现在它有点微妙了。

不过,问题是你是否需要记住它?

一些不错的评论:

c0r3ntin:

这很复杂,但不是每天都能遇到。这个值可以 address 吗?可以复制吗?可以移动吗?应该移动吗?只有在极少数情况下,你才需要主动去澄清并充分理解它们。(模板化库编写、热路径等)。大多数时候 C++并不比 java 或其他东西复杂。可悲的是大多数人都忘了这一点。C++可能是最复杂的语言,但是你可以编写非常好的代码而无需关心具体的细节。BigObject o=getBigObject();

初始化

现在有 18 种方式(从 C++17 开始)!

参阅:C++中的初始化是疯狂的;r/cpp线程

模板(和模板推导)

当我看到 C++17 的所有变更时,我很迷茫;关于模板的细节太多了。

同样的情况发生在 C++20 中,我们迎来了一个重大且期待已久的改进:概念——它彻底改变了 C++。

然而,如果你想学习模板,一开始可能会不知所措。

ABI

随着新特性列表的不断增长,“从头开始”修复 C++设计中的旧问题可能是很诱人的主题。但这种语言的原则是不能破坏旧代码,所以委员会非常严格,不喜欢改变已引入特性的路线。

这个问题没有正确的答案,但无论如何,一个经过充分讨论的主题要比仓促的举动更好。

缺乏依赖管理工具

我们可以抱怨 C++没有“交​付”一个很酷的依赖管理系统。但现实情况是,在可预见的未来,这可能都不会实现。拥有一个“标准”的包管理器是一个艰难的选择,尤其是它必须处理如此多的可用 C++的平台和系统。

不够安全

前段时间,你可以读到提到这个问题的一些文章(这篇和这篇):

谷歌工程师本周表示,Chrome 代码库中大约 70%的严重安全漏洞是内存管理和安全漏洞。


微软也是如此。由于大部分代码是 C 或 C++,所以每个人都指责 C++不够安全。

其他问题?

你在这种语言上遇到的主要问题都有哪些?

到目前为止,我们已经讨论了一些问题……那么如何应对它们呢?有机会解决这些问题吗?

如何保持理智

没有完美的编程语言;每种语言都有一些问题。以下是我关于如何处理现代 C++问题的建议:

    保持乐观

    使用最佳指南

    使用最好的工具

    跟上最新进展

    不要打开引擎盖

    使用你需要的

    增量变更

    最后的底线:你的旧代码仍然安全并且可以编译

保持乐观,语言在不断发展

没有人愿意使用旧的语法和结构来编写代码。我们已经看到很多关于 C++11 之前的旧版 C++的抱怨。人们花了将近 13 年的时间(从主要的 C++98 算起,不包括次要的 C++03)才提出新的主要版本:C++11。现在我们可以很高兴回到了正轨,每三年都会有一些变化。归根结底,你不能说你的语言已经死了。

虽然某些特性非常庞大,可能会带来混乱或需要学习更多东西,但实际情况其实很简单:

    在 C++03 之后添加的 1000 个新页面中的大部分用于标准库。这意味着你可以使用更多助手和子系统,而无需查找第三方库。这绝对会让你的生活更轻松。

    对于移动语义,你可以依赖库类型,因为它们会为你完成正确的工作。例如,你现在可以安全地返回std::vector并确保它可能被移动甚至被删除,而无需额外副本。

    至于模板,它变得越来越容易使用。概念让代码更安全,没有像 SFINAE 这样的技巧。更重要的是,我们有了constexprauto,让泛型代码更简单了(几乎就像常规代码一样)。

    至于安全性:在这里查看 C++指南的安全配置文件的自动化工具。C++ Core Check中的新安全规则|C++团队博客。我们可以期待新的、更好的工具来执行代码分析甚至检测,以尽快发现潜在的安全问题。或者看这篇文章:使用静态分析原理缩小Rust和C++之间的差距——SunnyChatterjee——CppCon

使用指南

如果你对 C++代码的许多方面都感到困惑,那么你应该查阅 C++核心指南。它由热心的 C++开发社区创建,主要编辑是 Herb Sutter 和 Bjarne Stroustrup。

看这里:

C++核心指南@Github

这里有一个漂亮的网站:

C++核心指南:网站

只需输入你面临的问题(例如return value),你就可以轻松找到建议——例如:指南:返回值

使用这些指南将为你节省大量时间,并且你可以非常快地学习一些好的模式。

还有工具!

感谢 Clang 以及其他平台上的开发速度提升,我们获得了如下工具:

    ClangTidy(以前是 clang-modernise)

    Clang Format

    Clang Static Analyzer

    VisualAssist

    Clion/ResharperC++

    VisualStudio——像C++ Core Checker这样的工具

    PVS Studio

    用于 VisualStudio 的Clang Power Tools

    新的C++核心检查规则|C++团队博客

    C++核心指南检查器参考|微软文档

    介绍vcperf/timetrace,用于C++构建时间分析|C++团队博客

    C++ Core Check中的新安全规则|C++团队博客——C++和 Rust 一样安全吗?

或者查看我关于其他工具的文章:C++生态系统:编译器、IDE、工具、测试等

虽然它不像其他语言(主要基于 Java 或基于.NET)那么好,但它正在变得越来越好。请记住,由于 C++语法复杂,因此很难实现即时分析代码的工具。

努力跟上最新进展

C++社区非常活跃。有很多博客、书籍、会议……甚至有可能在你所在的城市有本地社区。

首先,我建议去 isocpp.org 查看所有事件/新闻/文章。然后你可以查看Meeting C++和有关本地C++小组的信息。还有reddit/cpp,你可以在那里看到一些最棒的 C++故事。

还有CppCast——一个针对 C++开发人员的每周播客。

并参考以下书籍:

    C++编程语言第4版

    高效的现代C++

    编程:使用C++的原理和实践

    发现现代C++:科学家、工程师和程序员的强化课程

    C++之旅(C++深入系列)第2版

你还可以查看推荐的 C++资源列表:

Bartek的编程博客:资源

细节太多了?

C++如此强大的原因之一是它允许你实现非常接近底层的代码。你可以控制所有细节、内存布局、性能优化等……同时,这些能力增加了语言的复杂性。

不过,如果你不需要走那么远,你可以停留在相对较高的抽象级别。

例如,你不需要编写可选类型,因为你可以使用标准库中的std::optional。如果你不想涉及低级别和容易出错的联合类型,你应该意识到std::variant是一个安全的选项。

使用你需要的东西

C++是一种多范式语言;你可以以多种不同的方式使用它。最近,我读到了一条有趣的评论,说 Cpp 程序员在不接触模板元编程甚至异常等高级内容的情况下,也能持续多年表现出色。这在很大程度上取决于项目的代码风格。

例如,即使像谷歌这样的公司也限制了 C++的特性,比如说他们不使用异常。

如果你不是库开发人员,你可能不会遇到自定义移动运算符或移动构造器的麻烦。同样,高级元编程的内容也可能不是你的代码的关键部分。

增量变更

如果你是从头开始或只有一个小的代码库,那么转到 C++11/14 应该相对容易一些。可是 20 年(或更久!)前开始创建的上百万行代码呢?

只需一步一步来就行了。

至少对于新代码,你应该开始使用现代 C++。此外,通过应用“童子军规则”,你可以改进你所接触的那些代码。

这可能会带来一些混合代码,但还是比只保留老旧风格要好。

最后的底线:你的旧代码仍然可以编译

C++规范越来越大的原因之一是该语言向后兼容。所以委员会通常会引入新特性,但很少删除旧的东西。所以……你的代码仍然可以编译。如果你不想前进,不想使用新的东西,那么你还是可以保持当前的风格。

有时你会收到一些关于不推荐使用的内容或删除特性的警告(如 C++17 中的auto_ptr),但即使在这种情况下,你也可以将编译器切换到一些较旧的 C++标准。

总结

这篇文章有一些抱怨,也有一些“美化”。我试图找出这种语言及其演变过程中存在的各种问题,以及一些积极的改进迹象。虽然我们可以抱怨复杂性、变化的速度等,但我认为我们不能说这种语言已经死掉了。这是好事!:)

我认为你不必快速追逐新特性并立即重写现有代码。试着跟上进展,使用真正改进你工作的特性,你的代码应该逐渐改进并变得更加“现代化”(这是可以定义的,请参阅 meetingcpp 的相关文章)

    在采用 C++11/14/17/20 的新特性时,你的方法是什么?

    你使用 C++的主要问题是什么?

    你在工作中使用现代 C++吗?

相关资讯

到底什么编程语言最难学?C/C++说道:都让开,给“大佬”让位

汇编语言,在我看来,汇编绝对是最难学习的一门语言。汇编语言为什么难,得从它的特点说起,汇编是一门直接操纵处理器的低级语言,这里说它低级,是相对于高级语言(如C++/Python/Kotlin)之类编程语言而言。学习汇编可以让人更加清楚的了解

学习编程为什么选择C/C++,那么C++的强大之处到底体现在哪里呢?

首先必须明确:C语言是面向过程的,而C++是面向对象的!C和C++的区别C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首

都说C++太难学了!那么C++到底值不值得我们去学呢?

在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。很多人因为大学的原因接触C语言,却也是为了学习其他编程语言而打下基础,至于C++更是不用说,很多人不会去刻意

C/C++编程笔记:C++入门知识,从结构到类的演变

先来看看本节知识的结构图吧!接下来我们就逐步来看一下所有的知识点:结构的演化C++中的类是从结构演变而来的, 所以我们可以称C++为”带类的C”.结构发生质的演变C++结构中可以定义函数, 称之为成员函数结构定义格式, 像这样:struct

互联网行业成短视频人才聚集地,C++岗位平均年薪近50万元

记者 | 陈晓珍编辑 | 9月7日,猎聘发布的《短视频领域中高端人才招聘解析》(以下简称“报告”)显示,短视频领域新发职位的招聘年薪呈持续增长态势。2021年1-8月短视频新发职位平均招聘年薪为27.02万元,相比于2020年(21.05万

丰田也有老头乐?丰田C+pod,一台更比三台宏光MINIEV贵

提到我国交通道路中出现的一种“特产”,那就不得不提到“老头乐”。而在与我们隔海相望的“东瀛”,却也推出了类似的产品,而更令人意外的是,这款产品居然来自丰田。这是怎么一回事呢?快和玩车弟一起去看看吧!丰田C+pod,三门双座微型纯电车没错,玩

C++20即将于年底发布,C++23提上日程

作者 | Herb Sutter译者 | 弯月,责编 | 屠敏出品 | CSDN(ID:CSDNnews)C++20已全票通过,有望于今年晚些时候发布9月4日,C++ 20的国际标准草案投票结束,而且获得了全票通过。这意味着C++ 20已完

如何运用C+B运营思维,搭建用户积分体系?

这篇内容是接上篇《借鉴B端思维做用户增长》而写的,之前那篇文章是针对用户生命周期沉默用户阶段来谈用户增长,这篇文章主要针对成长期/成熟期的用户,谈如何用C+B的运营思维搭建积分体系,此外,引入广义积分概念看积分未来的发展趋势。源起首先,要从

C++介绍与入门学习

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应

C++这么难,为啥还是那么多人去学?

如果提到一种语言,可能说这辈子都不敢说精通,有相当数量的人辉选择c++,看看大家如何评述c++,用了两年的c++,转学别的语言发现从未有过的轻松感。c++这门语言比较特殊,是大家公认的人类不能精通的一门语言,如果精通了基本确定这人是非人类了

友情链接

SEO域名抢注宝宝起名网妈妈知道币圈立白洗衣液资讯网钦州新闻头条网琥珀蜜蜡网今日淄博朱氏国学起名网自行车之家大健康项目网陈鑫海影迷网徐氏取名字大全金秀瑶浴官网肇庆新闻头条网摩托车机车网乐山新闻头条网AI人工智能技术网吉安新闻头条网
c语言中文官网-零基础c++从入门到精通pdf、c语言编译器、C/C++开发工具、c语言入门自学零基础、c++入门自学、c/c++软件下载、c语言编程软件、c语言自学免费网站、c语言零基础自学视频教程、c++手机编程软件、c语言入门程序设计、初级编程视频教程、c语言在线编程平台、C语言线上作业网站。
c语言中文官网 chuxinxin.cn ©2022-2028版权所有