谷歌代码规范

Google 代码规范 C++总结 Google 代码规范 C++总结 题图引用 一张图总结Google C++编程规范(Google C++ Style Guide) 我个人觉得代码规范这种东西,读完要让人有个整体的感觉,在实际写代码的时候知道怎么写。然而Google C++ Style Guide的行文组织让人反而看不太懂,所以我做了一些调整,希望能够更加读者友好。题图是个非常好的具体示例,可以参考。 .h & .cpp 文件创建 使用#define 宏 进行 .h 重复include保护 #ifndef THIS_IS_A_H 阅读详情

英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

中文版:http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/

google c++ 编码规范:http://blog.youkuaiyun.com/xiexievv/article/details/50972809

网上有电子版 PDF ,可以下载看下。。。(电子版下载地址:https://pan.baidu.com/s/1i3gc7lF)

    Google C++ 编码规范很早就已经公开了,李开复也在其微博上公开分享:”我认为这是地球上最好的一份C++编程规范,没有之一,建议广大国内外IT研究使用。“

    Google C++ Style Guide是一份不错的C++编码指南,下面是一张比较全面的说明图,可以在短时间内快速掌握规范的重点内容。不过规范毕竟是人定的,记得活学活用。

保持一致也非常重要,如果你在一个文件中新加的代码和原有代码风格相去甚远的话,这就破坏了文件本身的整体美观也影响阅读,所以要尽量避免。
一些条目往往有例外,比如下面这些,所以本图不能代替文档,有时间还是把PDF认真阅读一遍吧。

异常在测试框架中确实很好用

RTTI在某些单元测试中非常有用

在记录日志时可以使用流
操作符重载 不提倡使用,有些STL 算法确实需要重载operator==时可以这么做。

注:原图较大,在新标签页中打开或保存到本地打开更清晰

在这里插入图片描述

头文件

函数参数顺序

C/C++函数参数分为输入参数和输出参数两种,有时输入参数也会输出(注:值被修改时)。输入参数一般传值或常数引用(const references),输出参数戒输入/输出参数为非常数指针(non-const pointers)。对参数排序时,将所有输入参数置于输出参数之前。不要仅仅因为是新添加的参数,就将其置于最后,而应该依然置于输出参数之前。这一点并不是必须遵循的规则,输入/输出两用参数(通常是类/结构体变量)混在其中,会使得规则难以遵守。

个人感受:这条规则相当重要,自己写代码的时候可能没有太大感觉,但是在阅读别人代码的时候感觉特别明显。如果代码按照这种规范来写,从某种角度来说,这段代码具有“自注释”的功能,那么在看代码的时候就会比较轻松。Doom3的代码规范中提到,“Use ‘const’ as much as possible”,也是同样的意义。当然,const除了阅读方便以外,还有个很重要的就是防止编码错误,一旦在程序中修改const变量,编译器就会报错,这样就减少了人工出错了可能性,这点尤为重要!

包含文件的名称及次序

将包含次序标准化可增强可读性、避免隐藏依赖(hidden dependencies,注:隐藏依赖主要是指包含的文件编译),次序如下:C 库、C++库、其他库的.h、项目内的.h。

项目内头文件应挄照项目源代码目录树结构排列,并且避免使用UNIX文件路径.(当前目录)和…(父目录)。

举例来说,google-awesome-project/src/foo/internal/fooserver.cc 的包含次序如下:
  #include “foo/public/fooserver.h” // 优先位置
  
  #include <sys/types.h>
  #include <unistd.h>

#include <hash_map>
  #include

#include “base/basictypes.h”
  #include “base/commandlineflags.h”
  #include “foo/public/bar.h”

注意,对应的头文件一定要先包含,这样避免隐藏依赖,隐藏依赖的问题不懂的可以去Google,网上有很多资料。另外,《C++编程思想》中提到的包含次序正好相反,从特殊到一般,但是有一点和Google代码规范是一样的,那就是对应的头文件是第一个包含。对于隐藏依赖的问题,以前只是习惯性的把对应的头文件放第一个,没有想过为什么,现在学习了……

作用域

全局变量

class 类型的全局变量是被禁止的,内建类型的全局变量是允许的,当然多线程代码中非常数全局变量也是被禁止的。永远不要使用函数返回值初始化全局变量。

不幸的是,全局变量的构造函数、析构函数以及初始化操作的调用顺序只是被部分规定,每次生成有可能会有变化,从而导致难以发现bug。因此,禁止使用class类型的全局变量(包括STL的string,vector等),因为它们的初始化顺序可能会导致出现问题。内建类型和由内建类型构成的没有构造函数的结构体可以使用,如果你一定要使用class类型的全局变量,请使用单件模式。

C++类

构造函数的职责

构造函数中只进行那些没有实际意义的初始化,可能的话,使用Init()方法集中初始化为有意义(non-trivial)的数据。

个人感受:这种做法可以从一开始就避免一些bug的出现,或更容易解决一些bug。构造函数+Init()函数初始化的方式与只用构造函数的方法相比,对计算机来说他们是没有区别的,但是人是会犯错的,这一条代码规范在某种程度上避免了一些人为错误,这个在开发中特别重要。

拷贝构造函数

仅在代码中需要拷贝一个类的对象的时候使用拷贝构造函数,不需要拷贝时使用DISALLOW_COPY_AND_ASSIGN这个宏(关于这个宏的内容,可以在网上搜到,我这里就不写了)。C++中对象的隐式拷贝是导致很多性能问题和bugs的根源。拷贝构造函数降低了代码可读性,相比按引用传递,跟踪按值传递的对象更加困难,对象修改的地方变得难以捉摸。

个人感受:和上一项的目的类似,为了避免人为错误!拷贝构造函数本来是为了方便程序员编程了,但是却有可能成为一个坑,为了避免这类问题,不需要拷贝时使用DISALLOW_COPY_AND_ASSIGN,这样在需要调用拷贝构造函数的时候就会报错,减少了人为出错的可能性。C#和Java在这方面就做得比较好,虽然性能上不如C++,但是人为出错的概率减少了很多。当然,使用一定的代码规范,可以在一定程度上减少C++的坑。

继承

虽然C++的继承很好用,但是在实际开发中,尽量多用组合少用继承,不懂的去看GoF的《Design Patterns》。

但重定义派生的虚函数时,在派生类中明确声明其为virtual。这一条是为了为了阅读方便,虽然从语法的角度来说,在基类中声明了virtual,子类可以不用再声明该函数为virtual,但这样一来阅读代码的人需要检索类的所有祖先以确定该函数是否为虚函数o(╯□╰)o。

多重继承

虽然允许,但是只能一个基类有实现,其他基类是接口,这样一来和JAVA一样了。这些东西在C#和JAVA中都进行了改进,直接从语法上解决问题。C++的灵活性过高,也是个麻烦的问题,只能通过代码规范填坑。

接口

虚基类必须以Interface为后缀,方便阅读。阅读方便。

重载操作符

除少数特定情况外,不要重载操作符!!!“==”和“=”的操作Euqals和CopyFrom函数代替,这样更直观,也不容易出错。

个人感受:看到这一条,我有点惊讶,在学习C++的时候,说重载操作符有神马神马好处,为什么现在又说不要重载操作符呢?仔细看了他的文档,确实说的有道理,导致可能出现的bug见其具体文档。在实际应用中,由于C++的坑实在太多了,不得不把这种“好用”的东西干掉,因为出了bug又找不到,是一件很O疼的事情。

声明次序

1)typedefs和enums;

2)常量;

3)构造函数;

4)析构函数;

5)成员函数,含静态成员函数;

6)数据成员,含静态数据成员。

宏 DISALLOW_COPY_AND_ASSIGN 置于private:块之后,作为类的最后部分。

其他C++特性

引用参数

函数形参表中,所有的引用必须的const!

个人感受:这么做是为了防止引用引起的误解,因为引用在语法上是值,却有指针的意义。虽然引用比较好用,但是牺牲其某些方面的特性,换来软件管理方面的便利,还是很值得了。

缺省参数

禁止使用函数缺省参数!

个人感受:看到这一点的时候觉得有点因噎废食了,其实缺省参数感觉还是蛮好用的。当然从另外一个角度来说,要使用C++就不要怕这种小麻烦,如果因为使用这些特性造成了找不到的bug,那会损失更多时间。

异常

不要使用C++异常。

这一点我没有看懂,也许是因为它的异常机制没有C#和Java那么完善吧……毕竟在C#和Java里面异常还是很好用的东东。

流

除了记录日志,不要使用流,使用printf之类的代替。

这一条其实是有一些争议的,当然大多数人认为代码一致性比较重要,所以选择printf,具体的可以看原文文档。

const的使用

在任何可以的情况下都要使用const。

这条规则赞一个,Doom3的代码规范里也提到了这一条。这么做有两个好处,一个是防止程序出错,因为修改了const类型的变量会报错;另一个就是方便阅读,使代码“自注释”。虽然这么做也有坏处,当然,总体来说利大于弊。

命名约定

1、总体规则:不要随意缩写,如果说 ChangeLocalValue 写作ChgLocVal还有情可原的话,把ModifyPlayerName写作MdfPlyNm就太过分了,除函数名可适当为动词外,其他命名尽量使用清晰易懂的名词;

2、宏、枚举等使用全部大写+下划线;

3、变量(含类、结构体成员变量)、文件、命名空间、存取函数等使用全部小写+下划线,类成员变量以下划线结尾,全局变量以g_开头;

4、普通函数、类型(含类与结构体、枚举类型)、常量等使用大小写混合,不含下划线;

使用这套命名约定,可以使代码具有一定程度的“自注释”功能,方便他人阅读,也方便自己以后修改。当然3、4两点也可以使用其他的命名约定,只要团队统一即可。

格式

1、行宽原则上不超过80列,把22寸的显示屏都占完,怎么也说不过去;

2、尽量不使用非ASCII字符,如果使用的话,参考 UTF-8 格式(尤其是 UNIX/Linux 下,Windows 下可以考虑宽字符),尽量不将字符串常量耦合到代码中,比如独立出资源文件,返不仅仅是风格问题了;

3、UNIX/Linux下无条件使用空格,MSVC的话使用 Tab 也无可厚非; (我没用过Linux,不懂为什么在Linux下无条件使用空格)

4、函数参数、逻辑条件、初始化列表:要么所有参数和函数名放在同一行,要么所有参数并排分行;

5、除函数定义的左大括号可以置于行首外,包括函数/类/结极体/枚举声明、各种语句的左大括号置于行尾,所有右大括号独立成行;

6、./->操作符前后丌留空格,*/&不要前后都留,一个就可,靠左靠右依各人喜好;

7、预处理指令/命名空间不使用额外缩进,类/结构体/枚举/函数/语句使用缩进;

8、初始化用=还是()依个人喜好,统一就好;

9、return不要加();

10、水平/垂直留白不要滥用,怎么易读怎么来。

写在最后

总的来说,这套代码规范还是相当不错的,既有防止错误使用C++的某些特性而导致bugs的规范,又有代码书写的相关规范使其便于阅读,建议搞C++的童鞋都看一看。当然,具体的团队应该会有具体的代码规范,代码风格方面大家可能会有一些区别;不使用C++某些特性(比如不使用C++异常,禁止使用函数缺省参数)方面,应该按照具体情况进行折中处理,而不应该生搬硬套代码规范;但是“不将字符串常量耦合到代码中”这种规范,是大家必须遵守的。

转载:https://blog.youkuaiyun.com/freeking101/article/details/78930381 方便自己学习,感谢博主

Google C++ Style Guide (中文+英文) Google C++ Style Guide 立即下载

相关推荐

Google C++ Style Guide (中文版).pdf

Google C++ Style Guide (中文版).pdf 指导C++编码规范

Google C++ Style Guide - Google C++ 风格指南

Google C++ Style Guide - Google C++ 风格指南

程永强 2312

Tiff、jpg图片怎么样添加地理坐标信息

Tiff、jpg图片怎么样添加地理坐标信息 一般,外业调查只有地图资料,如专题图、或者地形图,如何把这些地图资料的扫描地图带上坐标信息,从而内业实现信息化处理?以上问题,可以解决,但根据不同情况有不同的处理方法。     第一种,上面有经纬度外框,图片是矩形,但是没有地理信息。 通过图框的两个角的坐标确定范围,分别是左上(140°E,30°N);右下(150°W,30°N) 解决方

树木_xzw的博客 2万+

Google C++ Style Guide 谷歌 C++编码风格指南

代码规范

weixin_42944928的博客 2821

(R,线性回归)R语言里的模型诊断图(Residuals vs Fitted,Normal QQ , Scale-Location ,Residuals Leverage)

线性回归,是概率统计学里最重要的统计方法,也是机器学习中一类非常重要的算法。线性模型简单理解非常容易,但是内涵是非常深奥的。尤其是线性回归模型中的Diagnostics plot的阅读与理解一直被认为是线性回归中的一个难点。 在任何线性模型中,能够直接“lm”(模型有意义),既要考虑各个参数的t-test所得出的p-value,也要考虑总体模型F-检验得出的p-value。在这之后,还要清楚一个...

qq_35837578的博客 7万+

保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)

本文提供在Ubuntu 21.04上配置USRP X410的UHD 4.1驱动与Gnuradio 3.9的详细教程,涵盖虚拟机网络设置、依赖安装、源码编译及常见问题解决方案,帮助开发者高效搭建SDR开发环境。

weixin_27869497的博客 271

谷歌的C++代码规范

听李开复说,是世界上最好的代码规范,赶紧收藏啊。http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

xiaolantian的专栏 564

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5075

谷歌代码规范的中文版

谷歌代码规范的中文版 https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/

dbdxnuliba的博客 1973

AI预测彩票,使用chatgpt和lstm神经网络(文末附源码)

AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋)

淘淘小窝 1万+

GPU 资源池化云平台解决方案​

定义与特点Kubernetes是一个开源的容器编排和管理平台,通过提供自动化和声明式的方式来部署、扩展、维护和运行应用程序。它支持跨多个主机和集群部署容器,确保应用程序的高可用性和可扩展性。Kubernetes提供了丰富的功能和插件,允许用户根据自己的需求进行定制和扩展。架构与组件控制平面(Control Plane):负责集群的决策(如调度)和集群状态的检测与响应。

ZhangJiqun&191cm&85kg 1159

谷歌验证代码规范

谷歌验证代码规范 转载于:https://www.cnblogs.com/rhxuza1993/p/6377866.html

weixin_34186931的博客 118

R语言机器学习算法实战系列(四)随机森林算法分类器+SHAP值 (Random Forest)

本文介绍了如何使用R语言实现随机森林算法,用于构建乳腺癌分类器。随机森林通过多棵决策树投票判断标签,具有避免偏差和提升模型效果的优势。文章详细讲解了数据下载、R包加载、数据预处理、特征选择、模型构建与评估等步骤。数据集包含569份恶性和良性肿瘤样本的32类指标,通过随机森林模型进行特征选择和分类。最终,文章提供了完整的代码和可视化结果,帮助读者理解并实现随机森林算法。

专注生信领域 3318

谷歌代码规范笔记

谷歌代码规范 C++ 笔记 原文:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/headers/ 1.减小前置声明的使用,尽量使用#include 2.只有当函数只有 10 行甚至更少时才将其定义为内联函数.,包含循环,switch等不适合用内联函数 3.#include包含头文件有一点顺序,...

night李的博客 381

【AI黑话日日新】什么是算力调度?

算力调度 = 在有限资源下,把任务智能分配到最合适的计算节点,实现效率、成本、稳定性最优。更完整的定义:算力调度是对 CPU、GPU、内存、网络、存储等异构资源进行统一抽象、感知、决策、分配、监控与自愈的全生命周期管理,是分布式系统的“智能管家”。算力调度不是玄学,它是资源管理 + 算法 + 工程实践的结合。先懂概念 → 再玩工具 → 再写策略 → 再优化算法从单机到集群,从CPU到GPU,从离线到在线,循序渐进未来AI与算力网络时代,算力调度是性价比最高、最稀缺、最长期吃香的技术方向之一。

专注:太空算力、AI infra、异构调度、大模型成本工程 266

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

谷歌与Airbnb的JS代码规范

谷歌JS代码规范 规范代码原因:代码规范是为了保持源代码编写模式一致,便于维护代码,可读性高。 1、使用空格代替tab 规范随后指出应该使用2个,而不是4个空格带实现缩进。(除了每一行的终止符序列,ASCII水平空格符(0x20)是唯一一个可以出现在源文件中任意位置的空格字符) 2、不能省略分号 每个语句必须以分号结尾。不允许依赖于JS自动添加分号的功能。...

429

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

谷歌代码规范完全指南:从零开始掌握编程标准

谷歌代码规范是软件开发领域广泛认可的权威标准,它涵盖了多种编程语言的最佳实践,帮助开发者编写清晰、一致且可维护的代码。本指南将带你全面了解谷歌代码规范的核心内容,从基础原则到具体语言的实施方法,让你轻松掌握这一必备技能。 ## 为什么谷歌代码规范如此重要? 在团队协作和开源项目中,统一的代码风格至关重要。谷歌代码规范不仅能提高代码的可读性和可维护性,还能减少因风格不一致导致的沟通成本和错误。遵

gitblog_00148的博客 476

Devexpress16.2.6破解工具

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

谷歌代码规范2025:从团队痛点到高效协作的实战攻略

还在为团队代码风格混乱而苦恼吗?接手新项目时是否因为命名不统一而浪费大量时间?谷歌代码规范作为全球最权威的编码标准,已经帮助无数开发团队解决了这些难题。本文将带你重新认识2025年最新版规范,用全新的视角掌握从C++到TypeScript的跨语言编码艺术。 ## 攻克代码规范难题:为什么需要统一标准 在软件开发中,一致性永远比个人偏好更重要。谷歌代码规范通过严格的标准化要求,确保整个代码库的可

gitblog_01095的博客 694

代码规范有用吗?听听100W年薪谷歌大佬怎么说!

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。对于个人而言,日常编写代码只需要保持风格统一,前后一致,就是一个很大的胜利,然后再加入一些实用的规则,在写代码的时候有效减少可能引入的 bug。接下来,我截取了一些谷歌的 python 代码规范中一些有意思的要点,希望日后能更深刻的感受到它们的用处。

caixiangting的博客 993

不止是安卓,Java开发代码规范同样重要~附《谷歌Java开发规范手册》PDF

代码千万条,能跑最重要;编码不规范,同事两行泪! 前言 作为安卓开发者的人都知道,在客户端,大家的代码都是相互交叉的,一个模块的代码可能要经历数十人的蹂躏,才能形成一个完整的项目。 身为客户端开发语言之一的Java,我一直认为,Java 已经不再仅仅是一门语言,它是一个生态环境,既然是生态环境,那么维护好它,成为了我们开发铸造者的首要之选。 谷歌发布的代码规范中指出,80% 的缺失是由 20% 的代码所引起的。每个人写代码的思维方式、思路、方法不同,技术水平也不同,这时候确实需要有较为正式的编码规范作为.

老皮的博客 1043

谷歌C++代码规范

头文件: 1、头文件自包含:自己编译,不依赖其他的.h文件进行编译,首选将模板和内联函数的定义放置在与其声明相同的文件中。这些构造的定义必须包含在使用它们的每个.c文件中,否则程序可能无法在某些构建配置中链接。 2、#define警卫:所有头文件应该有#define保护以防止多次包含。符号名称的格式应为___H_。为了保证唯一性,它们应该基于项目源代码树中的完整路径。例如,项目foo中的文件f

最最最爱小盖的博客 892

IDEA使用谷歌代码规范格式化代码

谷歌代码格式化规范 代码格式化风格非常重要,代码格式和人穿衣服一样,如果代码乱糟糟的,就像人穿衣服一样乱糟糟的,看不下去要呕吐的感觉。市面上有几种非常优秀的代码格式化标准,这里选用谷歌的代码格式化标准。 谷歌的代码规范放在git仓库上,最好拉取文件到本地,直接载入到编辑器中,git地址 https://github.com/google/styleguide/blob/gh-pages/intel...

whgyxy的博客 1万+

谷歌C++代码规范精简版:系统级项目开发的工程化指南

C++是系统级基础设施、网络服务、游戏引擎等高性能场景的核心语言,但真正决定项目质量的并非语法技巧,而是代码库在长期演进中能否保持清晰、稳定与可维护。谷歌C++代码规范(Google C++ Style Guide)作为业界广泛采用的工程化共识,从命名、头文件依赖、作用域、类设计、智能指针到并发安全,形成了一套覆盖编码全生命周期的约束体系。这套规范的价值在于将“可读性、可维护性、可运行性”落到具体规则上:通过统一命名降低沟通成本,通过前置声明与pimpl切断依赖传染,通过所有权语义与移动语义规避悬垂指针和性

weixin_42522320的博客 316
上一篇: 十四、建造者模式
下一篇: 十三、适配器模式
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值