Google C++编码规范

1、 头文件

  • 所有头文件要能够自给自足(封装的足够完美),用户和重构工具不用为特定的场合包含额外的头文件
  • 所有的头文件都应该有#define保护来阻止头文件被多重包含,命名格式当是: H
  • 尽量使用包含头文件的形式,而不是用前置声明的形式
  • 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).(猜测的原因是包含循环和switch的通常超过10行代码)
  • #include的路径及顺序按照(当前文件头文件、C系统文件、C++系统文件、其它库的.h文件、本项目的.h文件),将当前文件头文件放在第一位的目的是保证维护这些文件的人们首先看到构建中止的消息而不是维护其他包的人们。
    2、 作用域
  • 命名空间
    1) 遵守 命名空间命名 中的规则(命名时考虑路径是一个不错的选择)
    2) 在命名空间的最后注释出命名空间的名字
    3) 不要使用using 引入整个命名空间的标识符号,这样容易造成命名空间污染
    4) 用命名空间把文件包含,在.cc文件中,不需要将自己定义.h文件包含在命名空间中
    5) 禁止用内联命名空间(匿名命名空间中的变量只有在当前文件可以访问,当然这不是禁用内联命名空间的原因,只是记录匿名命名空间的特性)
  • 静态变量
    函数和变量可以经由声明为 static 拥有内部链接性,这意味着你在这个文件中声明的这些标识符都不能在另一个文件中被访问。即使两个文件声明了完全一样名字的标识符,它们所指向的实体实际上是完全不同的。(static 会将全局变量的作用域改成仅文件中可见)
  • 函数
    尽量将非成员函数放到命名空间中,而不推荐直接使用裸的全局函数或者将该函数放到一个类中,并将其声明为静态成员函数。
    3、 类
  • 构造函数尽量使用explicit关键字修饰,这样的好处是,不允许隐式类型转换,类型转换最好借助cast进行转换
  • 仅当只有数据成员时使用 struct, 其它一概使用 class.
  • 将 所有 数据成员声明为 private, 除非是 static const 类型成员
  • 类定义一般应以 public: 开始, 后跟 protected:, 最后是 private:
  • 为避免拷贝构造函数, 赋值操作的滥用和编译器自动生成, 可将其声明为 private 且无需实现
    4、 函数
  • 尽可能编写简短的函数,提高复用性
  • 尽量多使用const进行限制参数,其实不只是参数,像返回值,成员函数也是这样
  • 对于虚函数, 不允许使用缺省参数, 因为在虚函数中缺省参数不一定能正常工作,虚函数中尽量不要使用默认参数是因为默认参数的解析是在编译期间完成的,而虚函数的调用是在运行时确定的。这两者之间的冲突可能会导致出现意外的结果。
  • 可以使用 cpplint.py 检查风格错误,Arch Linux 用户注意了, AUR 有对 cpplint 打包.
    5、 命名规则
  • 函数命名, 变量命名, 文件命名要有描述性; 少用缩写。总而言之就是一看名字就知道是做什么的(让没有参与开发的程序员知道)
  • 文件名要全部小写, 可以包含下划线 () 或连字符 (-), 依照项目的约定. 如果没有约定, 那么 “” 更好
  • 所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数 —— 均使用相同约定, 即以大写字母开始, 每个单词首字母均大写, 不包含下划线
  • 变量 (包括函数参数) 和数据成员(private)名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用(用struct声明的)
  • 声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合, const int kDaysInAWeek = 7;
  • 常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配,my_exciting_member_variable(),这个是取值函数,没有加get,直接数据成员名字,其实加上问题也不大,看个人习惯, set_my_exciting_member_variable()
  • 命名空间以小写字母命名. 最高级命名空间的名字取决于项目名称. 要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突。首先养成一个项目至少有一个最高级命名空间的习惯
  • 枚举的命名应当和 常量一致: kEnumName
  • 宏的命名应当写成这样:MY_MACRO_THAT_SCARES_SMALL_CHILDREN
    6、 注释
  • 使用 // 或 /* */, 统一就好,先养成在适当的地方加注释的习惯(程序员最烦的两件事,一个是自己写注释,另一个是别人不写注释,先做到自己写注释吧,哈哈哈)
    7、 行长度
  • 一行代码的长度不要超过120个字符

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

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

相关文章

【LangChain-04】利用权重和偏差跟踪和检查LangChain代理的提示

利用权重和偏差跟踪和检查LangChain代理的提示 一、说明 考虑到(生成)人工智能空间,(自主)代理现在无处不在!除了更强大且幸运的是开放的大型语言模型(LLM)之外,LangCh…

k8s学习-Service Account和RBAC授权

1.1 ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) 两种,它们的设计及用途如下: UserAccount是给kubernetes集群外部用户使用的&am…

【计算机二级考试C语言】C内存管理

C 内存管理 本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整…

测试用例流程设计

测试用例流程设计 简介 测试用例流程设计是指在进行软件测试时&#xff0c;对测试用例的整体规划和组织的过程。它涉及到制定一系列测试用例&#xff0c;以确保对软件系统的各个方面进行全面、系统和有效的测试。 现有测试用例的问题 可维护性不高 低模块化性&#xff1a;测…

re:从0开始的CSS学习之路 2. 选择器超长大合集

0. 写在前面 虽然现在还是不到25的青年人&#xff0c;有时仍会感到恐慌&#xff0c;害怕不定的未来&#xff0c;后悔失去的时间&#xff0c;但细细想来&#xff0c;只有自己才知道&#xff0c;再来一次也不会有太多的改变。 CSS的选择器五花八门&#xff0c;而且以后在JavaScr…

docker部署docker管理工具easydockerweb

重要提示 功能比较少,建议体验一下即可 安装 docker run -it -d -p 10041:3000 -e EDW_USERNAMEadmin -e EDW_PASSWORDadmin -v /var/run/docker.sock:/var/run/docker.sock qfdk/easydockerweb 使用 概览 镜像管理 容器管理

vue - 指令(一)

看文章可以得到什么&#xff1f; 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解&#xff0c;知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令&#xff1f;​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…

java多线程实现(二)Java并发容器和框架

一、CouncurrentHashMap 二、ConcurrentLinkedQueue 三、java中的阻塞队列 jdk7提供了7个阻塞队列 四、Fork / Join框架

SpringBoot日志插件log4J和slf4J的使用和比较含完整示例

点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》 1. 前言 本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j&#xff0c;并通过对比分析它们的优缺点&#xff0c;帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码&#xff…

Spring Data Envers 数据审计实战

随着各行各业信息化发展&#xff0c;决策者们越来越意识到数据版本追踪的重要性&#xff0c;尤其是上市公司&#xff0c;数据对于他们尤为重要。考虑到研发成本&#xff0c;对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。 对于…

有奖调查 | @所有人,MatrixOne 有一份问卷邀您填写~

MO社区系统调查问卷 活动时间&#xff1a;即日起至2月17日 前言 PREFACE 在“信创”国产化操作系统的号召下&#xff0c;随着 CentOS 7 的维护周期接近尾声&#xff0c;社区很多小伙伴都在积极调研新的操作系统进行测试和更换。为最大程度的保障 MatrixOne 在社区使用场景下…

设计模式学习笔记(一):基本概念;UML

文章目录 参考面向对象的设计原则创建型模式结构型模式行为型模式 UML视图图&#xff08;Diagram&#xff09;模型元素(Model Element)通用机制类之间的关系关联关系复杂&#xff01;&#xff01;聚合关系组合关系 依赖关系泛化关系接口与实现关系 参考 https://github.com/fa…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

c#cad 创建-圆(二)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是一个AutoCAD插件&#xff0c;用于在模型空间中创建一个圆形。 首先&#xff0c;我们需要定义一个命令类CreateCircleCommand&#xff0c;并在命名空间CreateCircleInCad中声明。 在CreateCircleCommand类中&a…

h5页面内嵌到app,解决ios无法使用左右侧滑返回上一页

背景&#xff1a;vuevant组合开发的h5页面&#xff0c;嵌入多个app,其中安卓手机都可实现侧滑返回上一页&#xff0c;而苹果端不行&#xff0c;app本身不展示title顶部的返回箭头。 解决办法&#xff1a;判断机型&#xff0c;处理ios端监听左右滑动事件&#xff0c;结合transit…

Java中的深拷贝和浅拷贝

在 Java 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在处理对象复制时的行为有所不同。 一、定义 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对象…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

flutter使用webview_flutter在安卓和ios上打开网页

webview_flutter仓库地址&#xff1a;webview_flutter | Flutter package github地址&#xff1a;https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 要打开非https协议的网页&#xff0c;需要在安卓平台上添加权限&#xff1a;andro…

C++ [NOIP2007 提高组] 矩阵取数游戏

有一个n行m列的矩阵&#xff0c;每个格子中有一个正整数。现在要从左上角的格子(1, 1)出发&#xff0c;每次只能向下或向右走一格&#xff0c;最后到达右下角的格子(n, m)。在走过的格子中取数&#xff0c;求取得的数的和的最大值。 输入&#xff1a; 第一行包含两个整数n和m&a…