《编写高质量代码改善C++程序的150个建议》读书笔记

【近源攻击】badusb制作 BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。 阅读详情

第一部分 语法篇

第1章 从C继承而来的

建议0:不要让main函数返回void

main函数只有以下两种定义方法是正确的:

int main(void)
int main(int argc, char *argv[])

main返回值的作用:

int main()
{
    return 0;
}

上面的代码在Linux环境下,采用命令:

g++ main.cpp

生成可执行文件a.out,然后,执行命令:

./a.out && ehco "success"

结果输出success
如果上述程序为:

int main()
{
    return -1;
}

则无输出。

建议1:区分0的四种面孔

  • 整形0
    00000000 00000000 00000000 00000000
  • 空指针NULL
    32位,代表地址
  • 字符串结束标志 ‘\0’
    占8位,00000000
  • 逻辑FALSE/false
    FALSE/TRUE 是int类型,占32位,false/true 是bool类型,占1位

建议2:避免那些有运算符引发的混乱

注意 == 和 = 的区别,为了防止出现问题,可以通过良好的代码习惯避免。

if(0 == n)
{
	// do something
}

此外还有&&和&,||和|的区别。

建议3:对表达式计算顺序不要想当然

熟悉操作符的优先级,多写几个括号。
如:

if(n & m == k)

if((n & m) == k)

注意函数参数和操作数的评估求值顺序问题。
如:

int i = 2010;
printf("the result are: %d %d", i, i+=1);

printf("the result are: %d %d", i, i+1);
a = p() + q() * r();

int para1 = p();
int para2 = q();
a = para1 + para2 * r();

建议4:小心宏#define使用中的陷阱

(1)使用宏定义表达式时,要使用完备的括号
如:

#define ADD(a, b) a + b
#define ADD(a, b) (a + b)
#define ADD(a, b) (a) + (b)

如果计算ADD(a, b) * ADD(c, d),本意是对(a+b)*(c+d)求值,但代码展开后变成了如下形式:

a + b * c + d
(a + b) * (c + d)
(a) + (b) * (c) + (d)

又如:

#define MULTIPLE(a, b) (a * b)

在计算(a+b)*c时,得到

(a + b * c)

要避免这些问题,要做的就是:用完备的括号完备地保护各个宏参数。正确的定义应为:

#define ADD(a, b) ((a) + (b))
#define MULTIPLE(a, b) ((a) * (b))

(2)使用宏时,不允许参数发生变化,警惕++,–等运算符。

(3)用大括号将宏定义地多条表达式括起来。
在这里插入图片描述

建议5:不要忘记指针变量地初始化

在适应局部指针变量时,一定要将其初始化。对于全局变量来说,在声明地同时,编译器会完成对变量地初始化。

建议6:明细逗号分隔表达式的奇怪之处

例如:

if(++x, --y, x<20 && y>0)

if的判断以最后一个表达式为准。

建议7:时刻提防内存溢出

在调用C语言字符串经典函数(如strcpy,strcat,gets等)时,尽量追踪传入数据的流向。在访问数据时,注意对边界数据要特殊情况特殊处理。还要杜绝使用未初始化指针和失效后未置NULL的“野指针”。

建议8:拒绝晦涩难懂的函数指针

如:

void (*p[10])(void(*)());

改为

typedef void(*pfv)();
typedef void (*pFun_taking_pfv) (pfv);
pFun_taking_pfv p[10];

使用typedef可以让函数指针更直观和易维护。

建议9:防止重复包含头文件

// 解决方法1
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
// statements
#endif

//解决方法2,仅VC++支持
#pragma once

建议10:优化结构体中元素的布局

如下面的代码:

struct A
{
    int a;
    char b;
    short c;
};   //sizeof(struct A) = 8
struct B
{
    char b;
    int a;
    short c;
};   //sizeof(struct B) = 12

了解结构体中元素的对齐规则,合理地为结构体元素进行布局。这样不仅可以有效地节约空间,还可以提高元素的存取效率。

建议11:将强制转型减到最少

// 将表达式的类型转换为T
(T) expression
T(expression)

这两种形式之间没有本质上的区别。
新风格的强制转型:

  • const_cast<T*>(a)
    它用于从一个类中去除以下这些属性:const、volatile和__unaligned.
class A { //...};
void Function()
{
    const A *pConstObj = new A;
    A *pObj = pConstObj; //ERROR: 不能讲const对象指针赋值给非const 对象
    pObj = const_cast<A*>(pConstObj); //OK
}
  • dynamic_cast<T*>(a)
    它将a值转换成类型为T的对象指针,主要用老实现类层次结构的提升。
class B { //...};
class D: public B { //...};
void Function(D *pObjD)
{
    D *pObj = dynamic_cast<D*>(pObjD)
}

建议12:优先使用前缀操作符

浅醉操作符省去了临时对象的构造,因此它在效率上由于后缀操作。

建议13:掌握变量定义的位置与时机

建议14:小心typedef使用中的陷阱

用途:

  1. 声明struct对象
  2. 定义一些与平台无关的类型
  3. 为复杂的声明定义一个简单的别名

建议15:尽量不要使用可变参数

可变参数的类型和个数在函数中由程序代码控制,导致编译器对可变参数的函数原型检查不够严格,难于查错,不利于写出高质量的代码。

建议16:慎用goto

建议17:提防隐式转换带来的麻烦

  1. 基本类型之间隐式转换(int,float)
  2. T* 指针到void* 的隐式转换
  3. 使用具名转换函数(cout<<1/2<<endl)
  4. 使用explicit限制的构造函数

建议18:正确区分void与void*

void 无类型
void 无类型指针

第2章 从C到C++,需要做出一些改变

建议19:明白再C++中如何使用C

extern "C"

建议20:是应用memcpy()系列函数时要足够小心

对于POD对象,可以通过对象的及地址和数据成员的偏移量获得数据成员的地址,但是在C++中,非POD对象的内存布局不确定。

建议21:尽量用new/delete代替malloc/free

new/delete在管理内存的同时调用了构造和析构函数,而malloc/free仅仅实现了内存分配与释放。
malloc/free时C/C++语言的标准库函数,而new/delete是C++的运算符。

建议22:灵活地使用不同风格的注释

// 以及/* */

建议23:尽量使用C++标准的iostream

建议24:尽量采用C++风格的强制转型

参考建议11

建议25:尽量用const、enum、inline替换#define(尽量把工作交给编译器而非预处理器)

在预处理阶段,预处理器会完成宏替换,因为此过程并不在百衲衣过程中进行,所以难以发现潜在的错误以及其他代码维护问题。

未完待续

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析! 数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整! 阅读详情

相关推荐

【爬虫】Python实现爬取淘宝商品信息(超详细)

项目基于Python的第三方库Selenium模拟浏览器运行、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。# 全局变量count = 1 # 写入Excel商品计数# 启动ChromeDriver服务# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式# 把chrome设为selenium驱动的浏览器代理;# 窗口最大化。

qq_46315152的博客 4万+

笔记:《编写高质量代码改善C++程序的150个建议》

读书记笔记

ji3009的博客 607

ADS2020与SystemVue2020Update1.0同机安装避坑指南:解决License冲突,实现EVM联合仿真

本文详细介绍了ADS2020与SystemVue2020 Update1.0同机安装的完整解决方案,重点解决License冲突问题,实现EVM联合仿真。通过合理的安装顺序、路径规划和License服务配置,确保两款EDA工具和谐共存,为射频与微波电路设计提供高效仿真环境。

weixin_30271335的博客 347

编写高质量代码:改善C++程序的150个建议(十五)

建议29:区分new的三种形态   C++语言一直被认为是复杂编程语言中的杰出代表之一,不仅仅是因为其繁缛的语法规则,还因为其晦涩的术语。下面要讲的就是你的老熟人—new:   它是一个内存管理的操作符,能够从堆中划分一块区域,自动调用构造函数,动态地创建某种特定类型的数据,最后返回该区域的指针。该数据使用完后,应调用delete运算符,释放动态申请的这块内存。   如果这就是你

greenbird的专栏 1008

城市NOA加速落地,BEV+Transformer引领自动驾驶感知新范式

数据闭环能力的建立,不仅依赖于数据规模,还依赖于数据的筛选、回传、标注、训练、验证与再部署,数据之于自动驾驶的价值再被印证的同时,也将推动自动驾驶迈向更为高阶的智能化时代。6月份,理想汽车向早鸟用户推送了首个不依赖高精地图的城市NOA。而特斯拉推出的基于BEV+Transformer的自动驾驶感知路线,可将2D图像转化为BEV鸟瞰图视角下的3D图像,并基于更庞大、更复杂、参数更多的感知算法模块,利用Transformer的注意力机制,将各个传感器统一到同一个连续的四维(三维空间+一维时间)时空中。

manfukeji的博客 1396

2019美亚杯团体赛刷题 部分题解(1-42、106-116)

文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的

7ruth0hn的博客 7544

《编写高质量代码改善C++程序的150个建议》摘录

内容摘自《编写高质量代码改善C++程序的150个建议》: 第一部分 语法篇 第1章从C继承而来的 建议0:不用让main函数返回void main函数的返回类型是int,不是void或其它类型。 建议1:区分0的4种面孔 (1)、整型0;(2)、空指针NULL,指针与int类型所占空间是一样的,都是32位;(3)、字符串结束标志’\0’;(4)、逻辑FALSE/false,...

架构设计 739

从零搭建一个虚拟ECU:手把手用Autosar CP模块模拟汽车灯控系统(基于Vector工具链)

本文详细介绍了如何使用Vector工具链从零搭建一个基于Autosar CP架构的虚拟ECU系统,模拟汽车灯光控制功能。通过环境搭建、模块配置、通信栈设置到灯光控制逻辑实现的全流程指导,帮助开发者掌握Autosar CP模块术语的实际应用,并提供了系统集成与测试的实用方案。

weixin_42628688的博客 312

编写高质量代码改善C++程序的150个建议

第一部分 语法篇 第1章从C继承而来的 建议0:不用让main函数返回void main函数的返回类型是int,不是void或其它类型。 建议1:区分0的4种面孔 (1)、整型0;(2)、空指针NULL,指针与int类型所占空间是一样的,都是32位;(3)、字符串结束标志’\0’;(4)、逻辑FALSE/false,FALSE/TRUE是int类型,而false/true是bool类型。 建议2:避免那些由运算符引发的混乱 不要...

jwy2014的专栏 1481

使用Jacob实现将Word文件转换为Pdf文件

如果是首次使用 jacob,建议先直接从 github上下载 zip包,因为在实现Word转Pdf的时候,不仅需要用到 jacob.jar,还需要 jacob.dll 库,而zip包中都有。官方使用文档可以参考:https://github.com/freemansoft/jacob-project/blob/main/docs/UsingJacob.md。// 如果安装的是微软的 Office,需要使用 Word.Application。

qq_41672950的博客 750

ESP32+LED12864液晶屏实战:手把手教你显示中文与自定义图标(附完整代码)

本文详细介绍了如何使用ESP32单片机驱动带字库的LED12864液晶屏,实现中文显示与自定义图标。从硬件选型、接线方案到驱动编写、字库解析,提供了完整的实战代码与优化技巧,并最终构建了一个智能家居控制面板的完整示例项目。

weixin_29212867的博客 145

《编写高质量代码:改善C++程序的150个建议》读书笔记2

《编写高质量代码:改善C++程序的150个建议》读书笔记2。

jiangwei0512的博客 703

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1734

《编写高质量代码:改善C++程序的150个建议》读书笔记1

《编写高质量代码:改善C++程序的150个建议》读书笔记1。

jiangwei0512的博客 945

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

编写高质量代码_改善C++程序的150个建议 读书笔记

这几天看了下这本书《编写高质量代码_改善C++程序的150个建议》,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习。 编写符合标准的main函数 C语言标准规定了main函数的两种标准形式: int main(void) int main(int argc, char* argv[]) C++03标准中给出了两种main函数的定义方式 int main() int main(...

weixin_30268921的博客 130

Devexpress16.2.6破解工具

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

《编写高质量代码:改善C++程序的150个建议》读书笔记3

《编写高质量代码:改善C++程序的150个建议》读书笔记3。

jiangwei0512的博客 629

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《编写高质量代码:改善C++程序的150个建议》读书笔记4

1. class和struct的区别。 这个是一般面试里面也会有的题目,之前看到的回答是关于访问权限的,struct默认是public的,而class默认是private的。 其它还有:在继承方面struct默认是public继承,而class默认是private继承。 另外在初始化的时候在大括号初始化方面也有些差别,但是因为C++11中已经统一了,具体也就不提了。   2. 编译器会创...

qq_41694204的博客 224

《编写高质量代码:改善C++程序的150个建议》读书笔记6(完结)

《编写高质量代码:改善C++程序的150个建议》读书笔记6(完结)。

jiangwei0512的博客 646

《编写高质量代码:改善C++程序的150个建议》读书笔记5(关于异常处理的部分)

《编写高质量代码:改善C++程序的150个建议》读书笔记5(关于异常处理的部分)。

jiangwei0512的博客 565

编写高质量代码:改善C程序的150个建议完整版

编写高质量代码:改善C#程序的150个建议完整版 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到本仓库!这里为您提供了《编写高质量代码:改善C#程序的150个建议完整版》的下载资源,旨在帮助您提高C#程序的代码质量和整合开发能力。 资源简介 本资源包含150个针对C#程序开发的实用建议,涵盖了编码规范、设计模式、性能优化等多个方面。通过阅读和实践这些建议,您将能够更好地...

gitblog_06722的博客 372
上一篇: SEAL context(3.1.0)
下一篇: 学习、面试参考资料
caorui_nk
博客等级 码龄10年 13粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值