简介

这是现代C ++,C ++ 17,C ++ 14和C ++ 11的一套核心指南,考虑了未来的增强功能和ISO技术规范(TS)。 目的是帮助C ++程序员编写更简单,更高效,更易维护的代码。

简介摘要:

  • 适用读者群
  • 宗旨
  • 非主要目标
  • 规范
  • 文档结构
  • 主要内容

使用读者群

适用于所有C++编程者以及C语言编程

宗旨

本文档的目的是帮助开发人员采用现代C ++(C ++ 17,C ++ 14和C ++ 11),并在代码库中实现更统一的风格。
我们不会妄图这些规则中的每一个都可以有效地应用于每个代码库。 升级旧系统很难。 但是,我们确实认为使用规则的程序比不使用规则的程序更不容易出错且更易于维护。 通常,规则也会导致更快/更容易的初始开发。 据我们所知,这些规则导致代码的表现与旧的,更传统的技术一样好或更好; 它们意味着遵循零开销原则(“你不使用什么,你不付钱”或“当你适当地使用抽象机制时,你至少获得了良好的性能,就像你用较低的手写代码一样 级别语言构造“)。 考虑这些规则对新代码的理想,在处理旧代码时利用的机会,并尝试尽可能接近这些理想。 记得:

Note

花点时间了解指南规则对你的程序将会产生深远影响

这些指南是根据“超集子集”原则(Stroustrup05)设计的。 它们不是简单地定义要使用的C ++子集(用于可靠性,安全性,性能等)。 相反,他们强烈建议使用一些简单的"extensions"(library components,这些扩展使得C ++中容易出错的最容易出现的特性变得冗余,从而可以禁止它们(在我们的规则集中)。

规则强调静态类型安全和资源安全。 出于这个原因,他们强调范围检查的可能性,避免解除引用nullptr,避免悬空指针,以及系统使用异常(通过RAII)。 部分是为了实现这一目标,部分是为了最大限度地减少模糊代码作为错误的来源,规则还强调简单性和隐藏在指定良好的接口背后的必要复杂性。

许多规则都是规定性的。 我们对简单地说 "don't do that!"的规则感到不安! 没有提供替代方案。 其中一个结果是,某些规则只能通过启发式方法来支持,而不是通过精确和机械可验证的检查。 其他规则阐明了一般原则。 对于这些更一般的规则,更详细和具体的规则提供部分检查。

这些指南解决了C ++的核心及其用途。 我们希望大多数大型组织,特定应用领域甚至大型项目都需要进一步的规则,可能还需要进一步的限制,以及进一步的图书馆支持。 例如, hard-real-time程序员通常不能自由使用免费存储(动态内存),并且会限制他们选择的库。 我们鼓励制定更具体的规则作为这些核心准则的附录。 构建理想的小型基础库并使用它,而不是降低编程水平以获得美化的汇编代码。

这些规则旨在逐步采用.
一些规则旨在增加各种形式的安全性,而其他规则旨在减少事故发生的可能性,许多规则都是这样做的。 旨在预防事故的指导方针通常禁止完全合法的C ++。 然而,当有两种表达想法的方式,一种表现出共同的错误来源而另一种却没有,我们试图引导程序员走向后者。

非主要目标

一般规则不是最小的或者其交集, 特别是,一般规则可以很简单,但不可执行; 此外,通常很难理解一般规则的含义。 更专业的规则通常更容易理解和执行,但如果没有一般规则,它们只是一长串的特殊情况。 我们提供旨在帮助新手的规则以及支持专家使用的规则。 一些规则可以完全实施,但其他规则基于启发式。
这些规则并不意味着像书本一样连续阅读。 您可以使用链接浏览它们。 但是,它们的主要用途是成为工具的目标。 也就是说,工具会查找违规行为,并且该工具会返回违反规则的链接。 然后,规则提供了理由,违规的潜在后果的示例以及建议的补救措施。

这些指南并非旨在替代C ++的教程处理。 如果您需要针对某些特定经验水平的教程,请参阅参考资料.

这不是如何将旧的C ++代码转换为更现代的代码的指南。 它旨在以具体的方式阐明新代码的想法。 但是,请参阅the modernization section,一些可能的现代化/恢复/升级方法。 重要的是,规则支持逐步采用:一次完全转换大型代码库通常是不可行的。

这些指南并不意味着在每种语言技术细节上都是完整或准确的。 有关语言定义问题的最终结论,包括一般规则和每个功能的每个例外,请参阅ISO C ++标准。

这些规则并不是为了强迫您在C ++的贫困子集中编写。 它们 着重并不意味着定义一个类似Java的C ++子集。 它们并不意味着定义单一的 one true C++语言。 我们重视表现力和不妥协的表现。

规则不是价值中立的。 它们旨在使代码比大多数现有C ++代码更简单,更正确/更安全,而不会降低性能。 它们旨在抑制与错误,虚假复杂性和糟糕性能相关的完全有效的C ++代码。

规则并不完美。 通过禁止在特定情况下有用的东西,规则可能会造成伤害。 规则可能会因为未能禁止在特定情况下出现严重错误的内容而造成伤害。 规则可以通过有歧义,模糊,不可执行或通过启用问题的每个解决方案来做很多伤害。 完全不符合 "do no harm" 标准是不可能的。 相反,我们的目标是不那么雄心勃勃:"Do the most good for most programmers";如果你不能遵守规则,反对它,忽略它,但不要把它淡化到毫无意义。 否则,建议改进。

规范

对于大型代码库,没有强制执行的规则是不可管理的。所有规则的强制执行只能针对一小部分弱规则或特定的用户社区。

  • 但是我们需要很多规则,而且我们需要每个人都可以使用的规则。

  • 但是不同的人有不同的需求。

  • 但是人们不喜欢阅读很多规则。

  • 但人们不记得很多规则。
    因此,我们需要特例来满足各种需求。

  • 但任意子集导致混乱。
    我们需要能够帮助很多人的指南,使代码更加统一,并强烈鼓励人们对代码进行现代化。 我们希望鼓励最佳实践,而不是将所有实践留给个人选择和管理压力。 理想的是使用所有规则; 这给了我们最大的好处。
    这加起来有很多困境。 我们尝试使用工具解决这些问题。 每个规则都有一个执行部分,列出了强制执行的想法。 可以通过代码审查,静态分析,编译器或运行时检查来执行强制执行。 在可能的情况下,我们更喜欢“机械”检查(humans are slow, inaccurate, and bore easily)和静态检查。 在没有替代方案的情况下,很少建议运行时检查; 我们不想介绍"distributed fat"。 在适当的情况下,我们使用相关规则组(called "profiles").的名称标记规则(in the Enforcement sections)。 规则可以是多个配置文件的一部分,也可以不是。 首先,我们有一些与常见需求(desires, ideals)相对应的配置文件:

  • type: 没有类型违规(reinterpreting a T as a U through casts, + + unions, or varargs)

  • bounds: 没有边界违规 (accessing beyond the range of an array)

  • lifetime: 没有内存泄露 (failing to delete or multiple delete) and no access to invalid objects (dereferencing nullptr, using a dangling reference).
    这些配置文件旨在供工具使用,但也可以作为人类读者的帮助。 我们不会将执行部分中的评论限制在我们知道如何执行的内容中; 一些评论只是希望可能激发一些工具制造者。
    实现这些规则的工具应遵循以下语法来明确禁止规则:

    [[gsl::suppress(tag)]]
    

其中“tag”是执行规则出现的项目的锚名称(e.g., for C.134 it is "Rh-public"),是规则组规则的名称("type", "bounds", or "lifetime"),或配置文件中的特定规则(type.4, or bounds.2)。

文档结构

每条规则(指南,建议)可以有几个部分:

  • The rule itself -- e.g., no naked new
  • A rule reference number -- e.g., C.7 (the 7th rule related to classes). Since the major sections are not inherently ordered, we use letters as the first part of a rule reference "number". We leave gaps in the numbering to minimize "disruption" when we add or remove rules.
  • Reasons(rationales) -- because programmers find it hard to follow rules they don't understand
  • Examples -- because rules are hard to understand in the abstract; can be positive or negative
  • Alternatives -- for "don't do this" rules
  • Exceptions -- we prefer simple general rules. However, many rules apply widely, but not universally, so exceptions must be listed
  • Enforcement -- ideas about how the rule might be checked "mechanically"
  • See alsos -- references to related rules and/or further discussion (in this document or elsewhere)
  • Notes (comments) -- something that needs saying that doesn't fit the other classifications
  • Discussion -- references to more extensive rationale and/or examples placed outside the main lists of rules
    有些规则难以机械检查,但它们都符合专家程序员可以毫不费力地发现许多违规行为的最低标准。 我们希望“机械”工具能够随着时间的推移而改进,以接近这样的专家程序员注意到的内容。 此外,我们假设规则将随着时间的推移而得到改进,以使其更加精确和可检查。
    规则旨在简单,而不是仔细地措辞,以提及每个替代和特殊情况。 此类信息可在备选段落和讨论部分中找到。 如果您不理解规则或不同意规则,请访问其讨论。 如果您认为讨论缺失或不完整,请输入一个问题,解释您的疑虑以及可能的相应PR。
    这不是语言手册。 它旨在对技术细节或现有代码指南提供有用而非完整的准确性。 推荐信息来源可在参考文献中找到。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,138评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,981评论 3 119
  • 我决定今天日更写点什么的时候,一个人突然就闯到我的眼前,虽然,我不知道怎么称呼他。 那是昨天早上的事,六点半,我已...
    云淡风轻之蓝阅读 688评论 26 23
  • 1、《国务院办公厅转发商务部等部门关于实施支持跨境电子商务零售出口有关政策意见的通知》 电子商务出口在交易方式、货...
    dd7885c7dcb5阅读 643评论 0 1
  • 我爱上了我的左手, 那是第一次拂过你发梢的温柔; 舞一只蝴蝶, 温情而迷迭; 我爱上了我的双耳, 那是第一次倾听你...
    铭熙不先森阅读 162评论 0 1