《C++编程规范》读书笔记(上)

CppCheck进阶指南:如何定制检查规则提升C/C++代码质量(附真实案例解析) 本文深入探讨了如何通过定制CppCheck检查规则来精准提升C/C++代码质量。文章绕过基础安装使用,重点解析了其数据流分析引擎的定制哲学,并提供了从编写XML规则、处理误报到集成CI/CD流水线的完整进阶实战方案,附有真实嵌入式项目案例,帮助开发者将静态分析深度融入项目开发流程。 阅读详情

      项目组一直没有做代码审查,最近有启动这项计划的打算,因此提前复习一下《C++编程规范》,并做一些笔记。我们做任何事通常都先从简单的入手,循序渐进,持续改进,那么做代码审查也不例外,《C++编程规范》又很多,如果一下子突然引入,会对代码编写提出过高的要求,对开发人员的打击比较大,从而可能会影响团队的整个士气,所以我想我们应该从最简单(即容易遵循做到)、最重要的几个规范开始,即追求 【有效性/复杂性】 最大化。

     联想到日程安排的十字表格,如法炮制了如下表格,以便分门别类:

代码审查
A(简单&很重要)C(复杂&很重要)
B(简单&较重要)D(复杂&较重要)

    当然,规范本没有重要与不重要之分,这里这样给其画上这样的标签,只是一个相对的概念,是给我们推进“代码审查”这项工作一个简单的指引,例如先实施A区的规则,一段时间后,当团队成员都习惯了这些规则,再实施B区的规则,基本上按照先易后难的顺序,依次推进。

    由于笔者的学识水平,以及经验所致,对一些规则的认识肯定存在偏差与不妥,还请同学批评赐教。

  《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices)

组织和策略问题

 第0条(D): 不要拘泥于小节(又名:了解哪些东西不应该标准化)

      是的,有些东西不应该规定过死。但是我们认为,在一些个人风格和喜好方面,保持团队内部的一致性是有好处的。一致性的重要性似乎怎么强调都不过分。

第1条(B):在高警告级别下干净利落地进行编译

      将编译器的警告级别调到最高,高度重视警告。编译器是我们的好朋友,如果它对某个构建发出警告,就说明这个构建可能存在潜在的问题。这个问题可能是良性的,也可能是恶性的。我们应该通过修改代码而不是降低警告级别来消除警告。

第2条(C):使用自动构建系统

      “一键构建”,甚至使构建服务器根据代码的提交自动进行构建,持续集成,不断交付软件产品,在迭代中完善。尽管现在有了很多开源的自动化构建系统,但是搭建并维护这样一个自动化构建系统,需要团队中有一位经验丰富的高手。

第3条(B):使用版本控制系统(VCS)

       VSS, SVN, GIT。

第4条(*):做代码审查

      审查代码:更多的关注有助于提高质量。亮出自己的代码,阅读别人的代码。互相学习,彼此都会受益。代码审查无需太形式主义,但一定要做,团队可根据自己的实际情况尝试着去做,在做的过程中,慢慢改进,找到一个符合团队实际需要的方式。CppCheck

设计风格

第5条(C):一个实体应该只有一个紧凑的职责

      一次只解决一个问题:只给一个实体(变量、类、函数、名字空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。

第6条(C):正确、简单和清晰第一

      软件简单为美(KISS原则:Keep It Simple Software):质量优于速度;简单优于复杂;清晰优于机巧;安全第一。可读性:代码必须是为人编写的,其次才是计算机。

第7条(C):编程中应该知道何时和如何考虑可伸缩性

    面对数据的爆炸性增长,应该集中精力改善算法的O(N)复杂度。在这种情况下,小型的优化(例如节约一个赋值、加法或乘法运算)通常无济于事。

第8条(A):不要进行不成熟的优化

第9条(A):不要进行不成熟的劣化

     构造既清晰又有效的程序有两种方式:使用抽象(DIP)和库(STL)。

第10条(B):尽量减少全局和共享数据

第11条(C):隐藏信息

第12条(D):懂得何时和如何进行并发性编程

      线程安全?并发编程?加锁解锁死锁?这些对我来说还只是属于概念......,鄙视一下自己!

第13条(B):确保资源为对象所拥有。使用显式的RAII和智能指针

     利器在手,不要再徒手为之。当然,也要防止智能指针的过度使用。如果只对有限的代码可见(例如函数内部,类内部),原始指针就够用了。

编程风格

第14条(C):宁要编译时和连接时错误,也不要运行时错误

第15条(A):积极的使用const

     const是我们的朋友,不变的值更易于理解,跟踪和分析。定义值的时候,应该将const作为默认选项。用mutable成员变量实现逻辑上的不变性,在给某些数据做缓存处理的时候经常使用这一特性。即在类的const成员函数中可以合法的修改类的mutable成员变量。

     当然,对于那种通过值传递的函数参数声明为const 纯属多此一举,反而还会引起误解。

第16条(D):避免使用宏

     这似乎是C++中一条人人皆知的编程规范。可真正严格遵守的团队并不多(纯属猜想,哈哈)。

第17条(D):避免使用“魔数”

    同第16条。

    应该用符号常量替换直接写死的字符串(或宏)。将字符串与代码分开(比如将字符串放入一个独立的CPP文件中),这样有利于审查和更新,而且有助于国家化。

第18条(A):尽可能局部地声明变量

    避免作用域膨胀。变量的生存期越短越好。因此,尽可能只在首次使用变量之前声明之(通常这时你也有足够的数据对它初始化了)。

第19条(B):总是初始化变量。

    这里有两段很好的示例代码:

// 虽然正确但不可取的方式:定义变量时没有初始化
int speedupFactor;
if (condition)
    speedupFactor = 2;
else
    speedupFactor = -1;


以下两种方式更好一些:

// 可取的方式一:定义变量时即初始化
int speedupFactor = -1;
if (condition)
    speedupFactor = 2;  

// 较好且简练的方式二:定义变量时即初始化
int speedupFactor = condition ? 2 : -1;

 

第20条(D):避免函数过长,避免嵌套过深

第21条(C):避免跨编译单元的初始化依赖

第22条(A):尽量减少定义性依赖。避免循环依赖。

    尽可能的使用前置声明(forward declaration). Pimpl惯用法对遵循这一规范有实际性的帮助。DIP(依赖倒置原则)。

第23条(A):头文件应该自给自足

   各司其责:应该确保每个头文件都能够单独编译。

第24条(A):总是编写内部的#include保护符,决不要编写外部的#include保护符

函数与操作符

第25条(B):正确地选择通过值、(智能)指针或者引用传递参数

第26条(C):保持重载操作符的自然语义

第27条(C):优先使用算术操作符和赋值操作符的标准形式

     1)如果要定义 a+b,也应该定义 a+=b。一般利用后者实现前者,即赋值形式的操作符完成实际的工作,非赋值形式的操作符调用赋值形式的操作符。2)如果可能,优先选择将这些操作符函数定义为非成员函数,并将其和要类型T放入同一个名字空间中。3)非成员函数返回值或引用,成员函数返回引用。

帖几段示例代码:

// 成员函数 @= 
T& operator@=(const T& rhs)
{
     //.....具体的实现代码.....
     return *this;
}

// 非成员函数 @ 
T  operator@(const T& lhs, const T& rhs)
{
T temp = lhs;
return temp @= rhs;
}

// 非成员函数 @= 返回输入参数的引用
T& operator@=(T& lhs, const T& rhs)
{
    // ......具体的实现代码......
    return lhs; // 返回输入参数的引用
}

// 非成员函数 @ 
T operator@(T lhs, const T& rhs)
{
    return lhs @= rhs;
}

 

第28条(A):优先使用++和--的标准形式。优先使用前缀形式
      如果定义了++C,也应该定义 C++,而且应该用前缀形式实现后缀形式。

标准形式,示例代码:

//  前缀形式
T& operator++()
{
    // ......执行递增的实现代码
   return *this; // 返回递增后的新值
} 

// 后缀形式
T operator++(int) // 返回值
{
     T oldT(*this); // 先保存原值
      ++(*this);  // 调用前缀形式执行递增
      return oldT; //  返回原值
}

 

第29条(D):考虑重载以避免隐含类型转换

第30条(A):避免重载操作符&&, || 和,(逗号)

第31条(A):不要编写依赖于函数参数求值顺序的代码

     调用函数时,参数的求值顺序是悬而未定的。

C/C++ 静态代码检查工具cppCheck Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误;Cppcheck可以检测出许多类型的错误,包括语法错误、未使用的函数、内存泄漏、未初始化的变量等;Cppcheck还支持用户自定义规则,这使得开发者可以根据自己的需求定制Cppcheck的行为;使用--suppress如果你想要忽略某些警告,可以在命令行中使用 --suppress 选项。 阅读详情

相关推荐

【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览

Cppcheck允许你通过命令行参数来启用或禁用特定的检查器。你可以使用--enable=参数来启用特定的检查器,或者使用--disable=参数来禁用特定的检查器。 例如,如果你只想启用内存相关的检查,你可以使用以下命令: cppcheck --enable=warning,performance,portability,information,missingInclude --suppress=missingIncludeSystem yourfile.cpp 这个命令将启用所有的警告,性能,可移植

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3499

cppcheck 自定义规则_cppcheck扫描规则

规则描述arrayIndexOutOfBounds数组下标越界arrayIndexThenCheck数组越界访问bufferAccessOutOfBounds缓冲区访问越界CastIntegerToAddressAtReturn把整数返回地址catchExceptionByValue函数返回的整数指针类型是不可移植的charArrayIndex类型用作数组索引,如果该值可以超过127将会有一个缓冲...

weixin_39865866的博客 1482

cppcheck规则编写文档

cppcheck编写自定义规则文档,cppcheck支持自定义规则,通过正则表达式编写检查规则

CppCheck静态代码检查工具教程【Windows和Linux端】

cppceck 是一个 C/C++ 代码分析工具。与 C/C++ 编译器和许多其他分析工具不同,它不检测语法错误。cppcheck 仅检测编译器通常无法检测到的错误类型。目标是没有误报。检查结果error:出现的错误warning:为了预防bug防御性编程建议信息越style:编码格式问题(没有使用的函数、多余的代码等)portablity:移植性警告。该部分如果移植到其他平台上,可能出现兼容性问题performance:建议优化该部分代码的性能。

stephenbruce的博客 1万+

ArcGIS Pro中如何批量替换数据源

不知您是否遇到过下面情况:ArcGIS Pro的Map/Scene中所引用的数据源被移动或重命名了,导致Map/Scene中找不到之前的数据,出现红色叹号;已有一个Map模板文件,图层的样式符号都是设置好的,想批量设置成另外一个数据源,复用该模板文件中的样式符号。 如果您在ArcGIS Pro的使用过程中遇到了上面情况,那么可以参考本篇文章,本文以图层存储在同一GDB中为例介绍。 情况一:Map中已有图层的数据源被移动了 原始Map长这样: 当数据源位置改变之后,显示找不到数据源的红色叹号: 这时如果右

xinying180的博客 7946

Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析

写在前面✍ 本系列笔记基于天池平台上“资金流入流出预测-挑战Baseline”学习赛,记录如何完整的打一次数据挖掘类比赛。同时,该比赛属于序列建模问题,希望学习完成这个任务,可以对序列问题的处理有一定的独立思考能力和实践操作能力,可以将所学理论,用编码的形式和实际的问题得到深入。 第一篇,EDA Content: 初步了解赛题及数据 1.1 任务 1.2 用户基本信息数据 1.3 用户申购赎回数据 1.4 收益率表 1.5 银行间拆借利率表 1.6 提交格式 1.7 评分指标 EDA 1 初.

小卜妞的博客 2358

C++编程规范 读书笔记(下)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 名字空间与模块 第57条(D):将类型及其非成员函数接口置于同一名字空间中 第58条(D):应该将类型和函数分别置于不同的名字空间中,除非有意想让他们一起工作        ADL(参数依赖查找,也成Koeing

小飞侠 679

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 284

《GOOGLE C++ 编程规范》读书笔记

GOOGLE C++ 规范读书笔记 1、头文件 1、使用#define避免头文件被重复包含,定义的宏为全路径+文件名; 2、能使用前置声明的地方尽量不使用#include。即如果不需要访问类定义的情况下,使用类的前置声明即可;需要类定义时,则必须得包含头文件。 3、只有当函数只有10行甚至更少时才将其定义为内联函数;内联包含循环或switch语句的函数常常是得不尝失(除非在大多数情况下

pointersky的专栏 989

DC/DC开关电源EMC仿真红宝书

本红宝书系统性介绍开关电源EMC仿真方法,包括仿真原理、仿真思路、仿真工具以及仿真效率提升与仿测一致性的实战经验。从理论到仿真,从仿真到应用,真正帮你实现一文掌握开关电源EMC仿真!全文约14000字,适读人群:开关电源设计、电磁兼容EMC相关从业者,电磁相关专业研究生及CST仿真爱好者等。

电磁学社 2498

Multisim 14.0元件库下载权威指南:官方与社区资源

详解Multisim元件库下载的官方途径与可靠社区资源,帮助用户快速获取Multisim 14.0所需元件模型,提升电路仿真效率。

weixin_32925455的博客 747

《C++编程规范》读书笔记

什么事匈牙利法?什么是泛型编程?为什么匈牙利法在泛型编程中根本不可行? 如何设置编译器的警告级别? 理解所有的警告,应该通过修改代码而不是降低警告级别来排查警告。 什么是RAII? 多线程的互斥锁应用RAII机制 STL 算法 84.用算法代替手工编写的循环 boost的lambda库 windows11使用最新版本boost的lambda库 boost中Function和Lambda的使用 观察者,桥接,工厂,访问者设计模式 transform for_each replace_if partition算

haimianjie2012的专栏 284

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2902

c++编程规范读书笔记

C++编程规范Steve McConnell:“始终站在代码阅读者和使用者的角度去编写和组织你的程序。”(一)文件结构头文件(.h/.hpp):程序声明定义文件(.cpp/.cxx):程序实现l1.1版权和版本的声明头文件开始处应列出:版权说明、程序功能、作者、版本号、生成日期、与其它文件的关系等。l1.2头...

weixin_33712881的博客 112

Java:PriorityQueue详解——从零基础到应用

看了网上的详解,我反是一篇没看懂,都是什么垃圾玩意也发出来,无语,我自己根据这两天的学习总结出来了下面这些干货,我就是这么学会的,大家要是零基础看肯定木问题。

流楚丶格念的博客 6141

OpenClaw分布式高可用部署实战:Docker+K8s集群化,支撑万级并发生产业务

OpenClaw从单节点到分布式高可用集群,是企业AI从试点到规模化落地的必经之路。基于Docker+K8s的部署方案,不仅解决了高并发、高可用、弹性伸缩的生产痛点,更让运维成本大幅降低,业务稳定性提升到99.99%。对于电商、制造、政务等对稳定性有极致要求的行业,这套方案是OpenClaw生产上线的标准形态——功能拉满的同时,守住安全、稳定、可控的底线。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 273

《C++编程规范》读书笔记(下)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 名字空间与模块   模板与泛型   错误处理与异常   STL:容器   STL:算法   类型安全

e5Max的专栏 1803

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《C++编程规范》读书笔记(中)

《C++编程规范——101条规则、准则与最佳实践》(C++ Coding Standards——101 Rules, Guidelines and Best Practices) 类的设计与继承   构造、析构与复制

e5Max的专栏 1491

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++ 编程规范101读书笔记(0)引论

前一段时间,工作和生活的事情比较多,一直没有时间好好地来学习,博客一直没有什么有价值的东西更新。最近把以前的工作辞了,也有时间来看看以前买的书,C++这方面的书,我有几本:> ,>,提高C++性能的编程技术>>,  以前只是扫描地看了一两遍。这次,想仔细地再看一遍,并在博客上整理出来,做个记录。

老程序员专栏 601

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++编程规范之编程风格(读书笔记)

第14条 宁要编译时和连接时错误,也不要运行时错误。摘要能够在编译时做的事情,就不要推迟到运行时:编写代码时,应该在编译期间使用编译器检查不变式(invariant),而不应该在运行时再进行检查。运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下能够获得更高的可信度。讨论C++语言中提供了强大的静态检查功能,而对自动运行时检

经天纬地 856

C++编程规范之stl容器(读书笔记)

第76条 默认时使用vector。否则,选择其他合适的容器第77条 用vector和string代替数组摘要:有助于编写更安全,伸缩性更好的软件第78条 使用vector(和string::c_str)与非C++ API交换数据摘要:vector和string::c_str是与非c++ api通信的通道,但是不要将迭代器当作指针,要获取vector::iterator iter所引用的元素

经天纬地 827

C++编程规范之设计风格(读书笔记)

第5条 一个实体应该只有一个紧凑的职责摘要一次只解决一个问题:只给一个实体(变量、类、函数、名称空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。第6条 正确、简单和清晰第一摘要软件简单为美(Keep It Simple Software,KISS):正确优于速度。简单优于复杂。清晰优于机巧。安全优于不安全(见第83条和第99条)

经天纬地 844

C++编程规范(读书笔记,待续)

组织和策略问题 在高警告级别干净利落地进行编译 使用版本控制系统 设计风格 一个实体应该只有一个紧凑的职责 不要进行不成熟的优化 避免进行不成熟的劣化 尽量减少全局和共享数据 隐藏信息 编程风格 宁要编译时和连接时错误,也不要运行时错误 积极使用const 避免使用宏 避免使用“魔数” 尽可能局部地声明变量 总是初始化变量 避免函数过长,避免嵌套过深 函数与操作符 保持重载操作符的自然语义 优先使用

机器人们的后勤仓库 427

读书笔记:《C++ 编程规范——101条规则、准则与最佳实践》(3)编程风格

豆瓣链接:《C++ 编程规范——101条规则、准则与最佳实践》 一个人的常量可能是另一个人的变量。——Alan Prelis 第 14 条:宁要编译、链接时错误,也不要运行时错误 以下是一些静态检查的例子: 编译时布尔条件 如果有些布尔值可以在编译期获得并需要检查,可以用 static_assert 代替运行时检查的 assert 。 编译时多态 用 “模板”...

Zhaosiyii的博客 420

C++编程规范之stl算法(读书笔记)

第83条 使用带检查的STL实现摘要:安全第一,大多数带检查的stl都会通过在容器和迭代器中添加附加的调试和支持信息来自动的检查这些错误。第84条 用算法调用代替手工编写的循环第85条 使用正确的STL查找算法第86条 使用正确的STL排序算法 摘要:理解每个排序算法的作用,选择能够实现所需而开销最低的算法。第87条 使谓词成为纯函数第88条 算法和比较器的参数应多用函数对象少

经天纬地 1002
上一篇: 《重构》读书笔记(十四)——第十五章 总结
下一篇: 《C++编程规范》读书笔记(中)
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值