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++版本还是等待几年?

CallMeDonk:

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

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

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

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

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

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

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

c0r3ntin:

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

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

参阅:

C++中的初始化是疯狂的

r/cpp线程

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

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

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

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

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

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

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

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

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

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

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

保持乐观

使用最佳指南

使用最好的工具

跟上最新进展

不要打开引擎盖

使用你需要的

增量变更

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

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

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

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

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

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

看这里:

C++核心指南@Github

这里有一个漂亮的网站:

C++核心指南:网站

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

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

ClangTidy(以前是clang-modernise)

ClangFormat

ClangStaticAnalyzer

VisualAssist

Clion/ResharperC++

VisualStudio——像C++CoreChecker这样的工具

PVSStudio

用于VisualStudio的ClangPowerTools

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

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

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

C++生态系统:编译器、IDE、工具、测试等

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

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

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

并参考以下书籍:

C++编程语言第4版

高效的现代C++

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

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

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

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

Bartek的编程博客:

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

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

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

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

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

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

只需一步一步来就行了。

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

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

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

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

THE END
1.人工智能助力教育知识百科用户贡献[zh确保使用 get 方法确保在任何环境下都能成功。 *当服务器的 HTTP状态码被提供给脚本时,重定向代码如302将导致重定向被自动且透明地遵循,只有当 http 方法是 get,并返回结果响应。如果 http 方法是其他类型的,那么 get 就会返回一个状态码为302的 http 响应,但是如果没有任何方法查看头部,你就不能知道你被重定...https://i.bnu.edu.cn/wiki/api.php?action=feedcontributions&user=Ty&feedformat=atom
2.编辑本段widget技术widget技术大家的说法是千奇百怪的,有人说它是一个运行在用户桌面的加热器,有人说它是桌面宠物,有人说它是张牙舞爪的机器人。但是没有人对于Konfabulator的描述是确切的。⒋ 终于在2003年2月10日的深夜,Konfabulator1.0正式版在Rose和Perry的共同努力下正式发布了。它是运行在苹果操作系统之上的小工具,其中的主运行文件...http://www.360doc.com/content/12/1018/10/1380006_242166641.shtml
3.68款破解软件(暴强悍的资料)游戏硬件/软件交流区可以让对方通过你的IP地址马上看到你的桌面或是活动窗口的样子,使用非常简便,只需要单击左上角的开关...https://bbs.3dmgame.com/thread-415839-1-942.html
1.使用C语言实现经典贪吃蛇游戏devc++如何做一个贪吃蛇大作战游戏为了实现这个项目,我们需要准备以下开发工具: VisualStudio Code 或其他任何C/C++ IDE。 Turbo C++ 或者安装了相应库的现代IDE,因为代码中使用了graphics.h,该头文件通常与Turbo C++一起使用。 MinGW 或者其他编译器,用来编译C代码。 注意:graphics.h库不是标准C库的一部分,在某些现代环境中可能不可用。如果不能使...https://blog.csdn.net/2302_79553009/article/details/143357143
2.贪吃蛇项目unity3dmob64ca13f34c58的技术博客05. 退出游戏实现 01. 开发背景 贪吃蛇起源于西方,来自于蛇骗夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开发出了贪吃蛇游戏。本公开课使用C语言开发一个贪吃蛇游戏。 贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种...https://blog.51cto.com/u_16213563/12493549
3.代码小浣熊个人免费版使用教程以下是代码小浣熊(Raccoon)个人免费版的使用教程,以Visual Studio Code(VS Code)为例:一、安装代码小浣熊插件打开VS Code:确保...https://ai.gameba.cc/wz/1158.html
4.如何通过C++钩子技术实现软件功能扩展编程语言通过C++钩子技术实现软件功能扩展是一种高级技术,它允许开发者在运行时修改或增强软件的功能。这种技术通常涉及到对软件内部结构的深入了解,以及对操作系统或应用程序加载机制的熟悉。以下是一个基本的步骤指南,帮助你理解如何实现这一目标: 1. 确定钩子点 首先,你需要确定你想要扩展的软件功能的钩子点。这些钩子点通常...https://m.yisu.com/zixun/918959.html
5.C#开源的虚拟桌宠模拟器,一个开源的桌宠软件,可以内置到任何WPF...虚拟桌宠模拟器是一款开源免费的桌面应用程序,它允许用户通过图形界面控制和互动地管理各种虚拟宠物。该软件支持多种交互功能,如喂食、玩耍等,并且可以自定义设置,以满足不同用户的需求。 要使用这个模拟器,你需要遵循以下步骤: 1. 首先,确保你已经安装了 Visual Studio,并创建了名为 VPet.sln 的解决方案文件。 2...https://www.coder100.com/index/index/content/id/4253497
6.回复即可体验ChatGPT大圣前端进阶指南安装桌面宠物软件:要使用桌面宠物,首先需要安装桌面宠物软件,可以从网上下载,或者在应用商店里搜索“桌面宠物”进行安装。 选择宠物:安装完成后,就可以选择一只桌面宠物,例如小猫、小狗、小兔子等。 设置宠物:选定宠物后,就可以为它设置一些属性,例如性格、颜色、发型等,使它更加具有个性。 http://shengxinjing.cn/blog/chatgpt.html
7.C++桌面宠物金鱼C++ 桌面宠物-金鱼评分: MFC环境下的桌面宠物,金鱼。。。 使用方法: //0,添加left.png,right.png资源文件 //1, 头文件定义变量 GoldFish pet; //2, 在CPP文件创建 // Create a goldfish if (!pet.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), /* CWnd:: */ GetDesktopWindow(...https://www.iteye.com/resource/hemmingway-6823935
8.curatedc/c++ 掘金 前端 前端-JavaScript 前端-Vue.js 前端-React.js 前端-CSS 前端-算法 前端-Node.js 前端-面试 前端-TypeScript 前端-游戏 前端-GitHub 前端-Webpack 前端-LeetCode 前端-后端 前端-Flutter 后端 Android IOS GitHub Javascript Vue Typescript ...https://gitee.com/didididiboom/curated-article