当前位置: 首页 > news >正文

《高质量C/C++编程》读书笔记一

前言

  这本书是林锐博士写的关于C/C++编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。
  良好的编程习惯,规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性、兼容性、可移植性。
  能够长期稳定地编写高质量程序的程序员称为编程老手;
  能够长期稳定地编写出高难度、高质量的程序员称为编程高手。
  写不出好的代码,只能说是自己内功修炼不到位,而不是用所谓真正的程序员如何如何做借口。

一、文件结构

  我们理应在头文件和定义文件的开头进行版权和版本的说明。这里应该具备的内容有:版权信息(毕竟不管代码多少优劣都是我们的劳动成果,有必要说明它可以用于哪些场景)、作者以及当前版本号。书中还有文件名称、标识符、摘要等,我认为这些不是必要的,可以根据自身需求取舍。就比如版本号这些的,实际上有是有gitee、github这类的代码托管平台比自己在代码内写上版本号更有用。

  为了避免头文件被重复引用,我们应该加上#pragma once;
  #include <filename.h>被用来引用标准库的头文件,#include "filename.h"被用来引用非标准库的头文件;
  头文件中应该只放声明,而不存放定义;
  尽量避免使用全局变量。

  如果一个软件的头文件数目比较多,通常应将头文件和定义文件分别保存于不同的目录,以便维护。如果有些头文件是私有的,他不会被用户的程序直接引用,则没有必要为其进行“声明”。为了加强信息的隐秘性,这些私有的头文件可以和定义文件放在同一个目录下。

二、程序的板式

  板式并不影响程序的功能,但是影响程序的可读性。所以我们应该追求清晰、美观的程序风格。

  在每个函数定义结束之后要加上空行;
  在一个函数内,存在紧密逻辑联系的语句之间不加空行,但是其他地方理应加上一行空行。

  一行代码应该只做一件事情。书中甚至认为一行应该只定义一个变量,我认为这是不合理的,如果一些变量存在一定的关联性是可以定义在同一行的,视情况是否添加一些必要的注释就行了。
  if、for、while、do等语句独占一行,执行语句不得紧跟其后。如果只有简单明了的一行语句可以不用加上{},但是其他情况下都应该加上{}。并且{应该抬行与if、for、while等对齐,而不能跟在后面,前端和java的一些代码风格是喜欢跟在后面的,这不是很合适;
   { 与 } 应该在同一列对齐,这样能够清楚的看到代码块;
  在定义变量就应该进行初始化,以达到减少隐患的目的。

  关键字之后要跟空格,函数名之后要紧跟(,以示关键字与函数的区别;
  单目操作符应紧跟操作数,让人能够清晰的看见被操作对象;
   , 与 ; 后面应该有空格,如果 ; 后没有其他语句则可以不用。

  代码的行的长度最大应该不超过80个字符,当然没必要可以去数,要适当的对长代码行进行拆分,拆分式要将操作符放在新行只首,这样可以突出它们之间的逻辑关系。

  修饰符*和&要紧靠变量名,防止引起一些不必要的误解。

  如果代码本身就清晰,就没必要添加注释;
  注释应当准确易懂;
  应当在编程的同时编写注释;
  注释应当在代码的上一行或代码行之后,而不能在代码的下一行。

  在写类时,我们应该采用以行动为中心的设计思想,即将函数写在前面,数据写在后面,毕竟我们更关心的是它能干什么,而不是它有什么数据。而且本身数据成员的名字应该是见名知意的。

相关文章:

《高质量C/C++编程》读书笔记一

前言 这本书是林锐博士写的关于C/C编程规范的一本书&#xff0c;我打算写下一系列读书笔记&#xff0c;当然我并不打算全盘接收这本书中的内容。   良好的编程习惯&#xff0c;规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性…...

【完美解决】python flask如何直接加载html,css,js,image等下载的网页模板

python flask如何直接加载下载的网页模板问题解决办法问题 本人网页开发小白&#xff0c;刚学了用flask&#xff0c;下载了一套网页模板&#xff0c;启动一个网页的确很简单&#xff0c;但是发现无论怎么改这里的 static_folder值都无法找到CSS,JS,IMAGE,FONT等资源 app Flas…...

2023美赛C题【分析思路+代码】

以下内容为我个人的想法与实现&#xff0c;不代表任何其他人。 文章目录问题一数据预处理时间序列模型创建预测区间单词的任何属性是否影响报告的百分比&#xff1f;如果是&#xff0c;如何影响&#xff1f;如果不是&#xff0c;为什么不是&#xff1f;问题二问题三难度评估模型…...

考研复试6 编译原理

第一章 编译器简介 1. 编译器的核心功能 把源代码翻译成目标代码 2. 编译器设计两个原则&#xff1a; 语义相同&#xff1b;以某种可察觉的方式改进输入程序 3. 编译器内部结构 前端&#xff1a;依赖于源语言&#xff0c;与目标机器无关。将输入的代码映射到 IR。包括分析部…...

uni-app:登录与支付--用户信息

用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中&#xff0c;定义如下的 UI 结构&#xff1a; <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…...

Docker 部署 MySQL

1. 进入下面路径下 -v 使用相对路径的方式挂载的目录docker会自动创建&#xff0c;路径为&#xff1a;/var/lib/docker/volumes/ cd /var/lib/docker/volumes/ 2. 指定版本5.7启动容器mysql docker run -p 3316:3306 --name mysql-master \ -v mysql-master-log:/var/log/mys…...

警惕,3月20日WOS目录更新,50本SCI/SSCI被剔除,这个出版社多达18本

2023年3月SCI、SSCI期刊目录更新 2023年3月20日&#xff0c;Web of Science核心期刊目录再次更新&#xff01;此次2023年3月SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年2月&#xff09;相比&#xff0c;共有50本期刊被剔除出SCIE & SSCI期刊目录…...

【 Linux入门 】之 手搓 命令行解释器 bash(带源码)

目的基本结构提取输入命令fgets的使用命令初步处理命令的本质创建子进程重要知识补充进程替换命令处理简单 bash 完成及演示优化bashls颜色输出颜色实现cd命令ecport 命令envecho $echo $&#xff1f;目的 主要目的在于进一步了解 Linux 系统下使用进程相关的系统调用 及 shel…...

【运维】运维常用命令

shell大全读取文件每一行内容文件是否存在数组定义和循环取值变量循环流程控制语句&#xff1a;case判断数值相等/大于/小于判断字符串相等awk求和、平均、最大、最小sed用法exprbc计算器读取文件每一行内容 while read line doecho $line done < a.txt文件是否存在 if [ …...

MYSQL常用命令大全

文章目录 基本语句链接数据库显示已有数据库创建数据库选择数据库显示数据库中的表显示当前数据库的版本信息,链接用户名删除数据库创建表表 增加将查询结果插入到新表中:表 删除表 修改表 查询in子查询between ~ and ~ 模糊查询模糊查询regexp中的OR:多个信息查询同义词:删…...

锚点定位方案

一 背景知识: 1.1 #号的作用 #代表网页中的一个位置。其右面的字符&#xff0c;就是该位置的标识符。比如&#xff0c;http://www.example.com/index.html#print 就代表网页index.html的print位置。浏览器读取这个URL后&#xff0c;会自动将print位置滚动至可视区域。 为网页…...

Flink学习--第一章 初识Flink

Flink是Apache基金会旗下的一个开源大数据处理框架&#xff0c;如今已被很多人认为是大数据实时处理的方向和未来&#xff0c;许多公司也都在招聘和储备掌握Flink技术的人才。 1.1 Flink的源起和设计理念 Flink起源于一个叫作Stratosphere的项目&#xff0c;它是由3所地处柏林的…...

电脑技巧:常见的浏览器内核介绍

浏览器是大家日常使用电脑必备的软件&#xff0c;网上查资料、听音乐、办公等等&#xff0c;都不离不开浏览器给我们提供的方便&#xff0c;今天小编来给大家介绍一下常见的浏览器内核&#xff0c;一起来学习一下吧&#xff01;1、Chromium 内核Google Chrom内核&#xff1a;统…...

【数据分析之道①】字符串

文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之…...

网络安全之防火墙

目录 网络安全之防火墙 路由交换终归结底是联通新设备 防御对象&#xff1a; 定义&#xff1a; 防火墙的区域划分&#xff1a; 包过滤防火墙 --- 访问控制列表技术 --- 三层技术 代理防火墙 --- 中间人技术 --- 应用层 状态防火墙 --- 会话追踪技术 --- 三层、四层 UTM …...

STM32之点亮一个LED小灯(轮询法)

目录 一、初始化GPIO口 二、按键点亮LED灯&#xff08;轮询法&#xff09; 一、初始化GPIO口 1、点亮LED小灯前&#xff0c;需要先初始化GPIO口 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) GPIO_TypeDef *GPIOx&#xff1a; //指初始化GPIO…...

pandas读CSV、读JSON、Excel

学习让我快乐 pandas的数据读取基本操作 pandas是Python中非常流行的数据处理库&#xff0c;它提供了许多强大的工具来读取、处理和分析数据。在本文中&#xff0c;我们将介绍pandas中的一些基本数据读取操作。 读取CSV文件 CSV文件是最常见的数据文件格式之一&#xff0c;p…...

企业站项目

企业站项目 一、项目实现结果 该项目共分为七大类&#xff1a;头部区域&#xff08;logo图片、输入框&#xff09;、导航区域、轮播图区域、内容区域、市场项目区域、产品中心区域、尾部区域 如图所示&#xff1a; http://企业站项目源码http://xn--vhquvo17e18gllbz7h2v9d …...

STM32开发(九)STM32F103 通信 —— I2C通信编程详解

文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解GPIO模拟I2C代码SHT30相关代码main函数中循环代码五、结果演示方式一、示波器分析I2C数据方式2、通过Modbus将获取到的数据传到PC上一、基础知识点 本实验通过I2C通信获取SHT30温湿度值&#xff…...

手撕数据结构—栈

Tips不得不再次提一下这个语法问题&#xff0c;当数组创建的时候&#xff0c;进行初始化的时候&#xff0c;分为全部初始化或者说部分初始化&#xff0c;对于不完全初始化而言&#xff0c;剩下的部分就全部默认为零。现在比如说你想对整型数组的1万个元素把它全部变成-1&#x…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...