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 2014-1368草案 年 11 月C 17-1586,草案,N4606C 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 这样的技巧。更重要的是,我们有constexpr和auto,让泛型代码更简单(几乎像常规代码)。至于安全:在这里查看 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 FormatClang Static AnalyzerVisualAssistClion/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 编程语言第四版高效现代C 编程:使用C 现代发现的原则和实践C :加强科学家、工程师和程序员的课程C 之旅(C 深入系列)第二版您还可以查看推荐 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 吗?