【C/C++数据结构与算法】华为C/C++编程规范

news2024/11/9 9:38:21

目录

一、文件结构

二、程序版式

三、命名规则

四、表达式与基本语句

五、常量

六、函数设计

七、内存管理

八、C++高级特性


一、文件结构

  1. 避免头文件被重复引用,用 #pragma once 进行预处理
  2. 用 <> 引用标注库头文件,用 "" 引用自定义库头文件
  3. 头文件的职责应该单一,每一个.c文件应有一个同名的.h文件
  4. C语言头文件只进行函数声明,不进行函数定义;C++类的成员可在声明的同时定义
  5. 禁止在头文件中定义变量,防止重定义
  6. 头文件包含顺序可以从稳定性和字符升序两个角度进行排列,稳定性差(自定义头文件)置于前面在编译报错时可以节约时间,按字符升序排列可以避免头文件重复包含

二、程序版式

  1. 每个类声明、函数定义之后都要加上空行,函数体内可用空行进行逻辑分隔
  2. 一行代码只执行一条语句,if、while、for、case、switch、default 需独占一行,如果 if 语句中有一个分支需要 '{}',则所有分支都需加上 '{}'
  3. 尽可能在定义变量的同时进行初始化,禁止使用未初始化的变量作为右值
  4. 关键字之后留一个空格,函数后面不留空格以区分关键字,操作符视情况留空格
  5. 花括号选择微软风格,即前后花括号各占一行且在同一列
  6. 类的封装“以行为为中心”,将public的函数写在前,将private的数据写在后
  7. 注释与内容之前留一个空格

三、命名规则

  1. 文件:文件命名规则统一使用小写字符,通过“_”分割长命名,原因是考虑不同系统的兼容问题,不同系统对大小写的区分规则不同,故统一采用小写字符
  2. 变量:“名词”或“形容词+名词”命名变量,禁止使用单字符命名变量,允许使用i、j、k作为局部循环变量,除了常用的通用缩写外,不使用单词缩写命名,风格为“小驼峰命名”,即以小写字母开头大写字母分做分割,如 maxVal、stuName
  3. 函数:“动词”或“动词+名词”, 由于系统接口大部分是小写字母加 “_”分割,所以为了避免与系统接口或标准库函数命名冲突,我们的自定义函数统一采用“大驼峰命名法”,即以大写字母开头并以大写字母分割,如 GetVal、IsEmpty
  4. 类与结构体:用大写字母开头的单词组合而成,“大驼峰命名”,例如 Node、ListNode
  5. 常量(宏):全大写字母,用下划线分隔,例如 MAX、MAX_VALUE;定义宏常量时,必须要使用完备的括号
  6. 静态变量:加前缀“s_”
  7. 全局变量:尽量避免使用,使用时加前缀“g_”
  8. 类的数据成员:加前缀“_”

四、表达式与基本语句

  1. 一元运算符的优先级高于二元运算符
  2. 不可将浮点数用 “==” 或 “!=” 与任何数字进行比较,而应该比较精度
  3. 多重循环中,将长循环放内层,短循环放外层,减少cpu跨切循环层的次数
  4. 当逻辑判断嵌套循环语句,先进行逻辑判断再执行循环语句,可提高效率
  5. if 语句应当由 else 结束,所有 switch 语句必须有 default 分支
  6. switch 语句的每个 case 语句都要视条件尽量加上 break,避免多分支重叠
  7. goto 语句存在破坏程序结构化的隐患,慎用,但在多重循环中可直接跳出循环

五、常量

  1. const常量具有数据类型,而宏常量没有数据类型,编译器可对前者进行安全检查
  2. C++程序中完全用const常量取代宏常量
  3. 枚举常量在整个类中都是恒定的常量,不会占用对象的存储空间

六、函数设计

  1. 若参数是不需要修改的值,在类型前面加上const,防止被意外修改
  2. 用 & 引用传参可省去临时对象的构造和析构过程,提高效率
  3. 在函数入口处用 assert 断言检查参数有效性,assert是仅在debug版本起作用的宏
  4. 引用必须被初始化,且不能为空,一旦初始化就不能改变引用的关系

七、内存管理

  1. 动态内存的申请与释放必须配对,malloc/free 和 new/delete,避免内存泄漏
  2. 释放内存之后,将指针置空,避免出现“野指针”
  3. malloc/free 是C/C++标准库函数,new/delete 是C++运算符,new/delete 拥有构造和析构功能
  4. C++代码用 new/delete 取代 malloc/free

八、C++高级特性

  1. 重载:同一个类中,函数名相同,参数不同
  2. 覆盖:派生类与基类中,函数名相同,参数相同,基类必须有vitrual关键字
  3. 隐藏:派生类的函数屏蔽了其同名的基类的函数,注意区别隐藏与覆盖
  4. 当基类与派生类函数同名,若参数相同,基类有virtrual关键字是覆盖,无则是隐藏;若参数不同,则一定是隐藏
  5. 参数缺省值:参数的缺省值只能从后往前逐个进行缺省
  6. 不能被重载的运算符:(1) . (2) ?: (3) .* (4) :: (5)sizeof
  7. C++用内联函数取代宏代码,内联关键字 inline 必须与函数定义放在一起才能生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Servlet图书管理系统测试报告

密级 中级 (供内部测试完毕后使用) Servlet图书管理系统 测试报告 报告编号: ServletBMS-TR-1 &#xff08;Servlet Book Management System-Testing Report&#xff09; 部门经理______项目经理______ 开发经理______测试经理______ 研发公司: 第六科技有限公司 用户单…

【Web服用应用】LVS+Keepalived群集

LVSKeepaLived群集 一、Keepalived及其工作原理1.1Keepalived体系主要模块及其作用1.2健康检查的方式&#xff08;探针&#xff09; 二、LVSKeepalived 高可用群集部署2.1LVS部署<font colorred>1.配置负载调度器&#xff08;主、备相同&#xff09;2配置节点服务器 三、…

JS逆向吐环境

这里调用时机是webpack加载器加载完成后的吐出 1.定位加载器 2.断下目标模块 1.加载完成后&#xff0c;sfu(t), 可以看到明显的加载器&#xff0c;手扣太费劲&#xff0c;直接输出吧 可以看到明显的模块函数&#xff0c;随便测试一个 把函数转为字符串&#xff0c;调用的函数环…

chatgpt赋能python:Python中的矩阵合并方法:介绍和使用方法

Python中的矩阵合并方法: 介绍和使用方法 矩阵合并是Python编程中常用的操作之一&#xff0c;特别是针对数据分析、机器学习和深度学习等领域。Python提供了多种方法来合并矩阵&#xff0c;本文将介绍这些方法并分享如何在实际应用中使用它们。 普通矩阵合并 最基础的矩阵合…

前端vue入门(纯代码)06

【04.mixin混入】 功能&#xff1a;可以把多个组件共用的配置提取成一个混入对象 使用方式&#xff1a; 第一步&#xff1a;定义混合并暴露。 export const mixin {data(){....},methods:{....}.... }第二步&#xff1a;导入mixin.js【混入】文件&#xff0c;并使用混入。 全局…

动态规划dp —— 20.环形子数组的最大和

因为数组是环形的&#xff0c;所以子数组最大和有两种情况&#xff1a; 一个数组内所以数的和是固定的&#xff0c;如果阴影部分是最大子数组和&#xff0c;那么空白部分就是最小子数组和&#xff0c;因此&#xff1a;第二种情况下&#xff0c;只需要求得最小子数组和&#xff…

Java虚拟机——垃圾收集算法

垃圾收集算法的实现涉及大量的程序细节。这里只重点介绍 分代收集理论 和 几种算法思想及发展过程 3.3.1 分代收集理论 分代收集建立在两个 分代假说之上 弱分代假说 &#xff1a; 绝大多数对象都是朝生夕灭的强分代假说&#xff1a; 熬过越多次垃圾收集过程的对象就越难以…

chatgpt赋能python:Python与数据库连接的完整指南

Python与数据库连接的完整指南 作为全球最受欢迎的编程语言之一&#xff0c;Python已经被广泛应用于各种领域&#xff0c;特别是与数据库的交互。 Python拥有用于连接各种数据库的强大库和API&#xff0c;其中包括MySQL&#xff0c;Oracle&#xff0c;PostgreSQL等。在这里&am…

远程控制和原理和实践

按理来说&#xff0c;本人不该发表此类专业的文章&#xff0c;但是从鄙人的开发经历出发&#xff0c;让本人斗胆在此对远控软件做一些论述&#xff0c;谈论一点自己的认识。 程序工程代码地址&#xff1a;点击此处下载。 程序分为两个部分&#xff0c;控制端和被控端&#xf…

【Note7】uboot,

文章目录 1.uboot1.U-Boot命令之常用命令&#xff1a;7.U-Boot命令之EMMC和SD卡操作命令&#xff1a;一般EMMC和SD卡是同一个东西&#xff0c;没特殊说明&#xff0c;统一MMC来代指EMMC和SD卡8.U-Boot命令之内存操作命令&#xff1a;直接对DRAM进行读写操作&#xff0c;uboot命…

CMake学习(7): CMake的嵌套

博客参考自&#xff1a;爱编程的大丙: https://subingwen.cn/cmake/CMake-primer/ ,仅供学习分享使用 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过 CMake 管理项目的时候如果只使用一个 CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&…

【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

目录 1、Linux内核输入子系统概念导入1.1 输入设备工作机制1.2 运行框架1.3 分层思想 2、驱动开发步骤2.1 在init()或probe()函数中2.2 在exit&#xff08;&#xff09;或remove&#xff08;&#xff09;函数中&#xff1a;2.3 上报事件2.4 input驱动要素导图2.5 input驱动的总…

代码生成器实现

代码生成器实现 实现封装元数据的工具类实现代码生成器的代码编写掌握模板创建的 构造数据模型 需求分析 借助Freemarker机制可以方便的根据模板生成文件&#xff0c;同时也是组成代码生成器的核心部分。对于Freemarker而 言&#xff0c;其强调 数据模型 模板 文件 的思…

chatgpt赋能python:Python与硬件结合的现实价值

Python与硬件结合的现实价值 Python是当今最受欢迎和广泛使用的编程语言之一&#xff0c;因其易学易用、开放源代码和灵活性而备受欢迎。但是当我们将它与硬件相结合&#xff0c;它能做到什么&#xff1f; 在这篇文章中&#xff0c;我们将向您介绍如何将Python与硬件结合&…

戴尔外星人m16r1国行中文原厂Windows11系统自带Support Assist OS Recovery恢复出厂设置

戴尔外星人m16r1国行中文原厂系统自带Support Assist OS Recovery恢复出厂设置 文件地址https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 支持Support Assist OS recovery型号: 戴尔外星人m18r1国行中文版Windows11系统 戴尔外星人x16r1国行中文版…

2023/6/9总结

CSS Less嵌套 子元素的选择器可以直接写在父元素里面。 如果不是它的后代元素&#xff0c;比如你想写伪类选择器、交集选择器&#xff0c;需要在前面加&号。 Less运算&#xff1a; 加减乘除都可以&#xff0c;运算符必须用空格隔开。如果俩个元素都有单位&#xff0…

【SpringBoot 3.x】使用starter整合Druid

Druid介绍 Druid是阿里巴巴的一个开源项目&#xff0c;号称为监控而生的数据库连接池&#xff0c;在功能、性能、扩展性方面都超过其他例如DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等连接池,而且Druid已经在阿里巴巴部署了超过600个应用&#xff0c;通过了极为严格的考…

网络作业9【计算机网络】

网络作业9【计算机网络】 前言推荐网络作业9一. 单选题&#xff08;共12题&#xff0c;36分&#xff09;二. 多选题&#xff08;共1题&#xff0c;3分&#xff09;三. 填空题&#xff08;共2题&#xff0c;10分&#xff09;四. 阅读理解&#xff08;共1题&#xff0c;17分&…

C++【STL】之string的使用

STL简介 STL是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。STL由六大组件构成&#xff1a;仿函数、算法、迭代器、空间配置器、容器和配接器。 其中各种容器可以很大帮助的提升我们编写程序的效率&#…

静态NAT配置与验证实验

静态NAT配置与验证实验 【实验目的】 部署静态NAT。熟悉静态NAT的应用方法。验证配置。 【实验拓扑】 实验拓扑如图所示。 实验拓扑 设备参数如表所示。 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 f0/0 192.168.10.1 255.255.255.0 N/A S1/0 10.0.0.1…