Google C++编程风格指南(六)

python常用注释风格-Google 主要有PEP8 规范,PEP 257,以及Google的注释风格。PEP8是官方的、基础性的规范(略略略)。PEP257是Python Enhancement Proposal(增强规范)的一部分,专门针对文档字符串。 阅读详情

原文地址:Google C++ Style Guide

  • 注释

注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、注释在哪儿。当然也要记住,注释的确很重要,但最好的代码本身就是文档(self-documenting),类型和变量命名意义明确要比通过注释解释模糊的命名好得多。

注释是为别人(下一个需要理解你的代码的人)而写的,认真点吧,那下一个人可能就是你!

1. 注释风格(Comment Style)

使用//或/* */,统一就好。

//或/* */都可以,//只是用的更加广泛,在如何注释和注释风格上确保统一。

2. 文件注释(File Comments)

在每一个文件开头加入版权公告,然后是文件内容描述。

法律公告和作者信息:

每一文件包含以下项,依次是:

1) 版权(copyright statement):如Copyright 2008 Google Inc.;

2) 许可版本(license boilerplate):为项目选择合适的许可证版本,如Apache 2.0、BSD、LGPL、GPL;

3) 作者(author line):标识文件的原始作者。

如果你对其他人创建的文件做了重大修改,将你的信息添加到作者信息里,这样当其他人对该文件有疑问时可以知道该联系谁。

文件内容:

每一个文件版权许可及作者信息后,都要对文件内容进行注释说明。

通常,.h文件要对所声明的类的功能和用法作简单说明,.cc文件包含了更多的实现细节或算法讨论,如果你感觉这些实现细节或算法讨论对于阅读有帮助,可以把.cc中的注释放到.h中,并在.cc中指出文档在.h中。

不要单纯在.h和.cc间复制注释,复制的注释偏离了实际意义。

3. 类注释(Class Comments)

每个类的定义要附着描述类的功能和用法的注释。

// Iterates over the contents of a GargantuanTable.  Sample usage:
// GargantuanTable_Iterator* iter = table->NewIterator();
// for (iter->Seek("foo"); !iter->done(); iter->Next()) {
// process(iter->key(), iter->value());
// }
// delete iter;
class GargantuanTable_Iterator {
...
};

如果你觉得已经在文件顶部详细描述了该类,想直接简单的来上一句“完整描述见文件顶部”的话,还是多少在类中加点注释吧。

如果类有任何同步前提(synchronization assumptions),文档说明之。如果该类的实例可被多线程访问,使用时务必注意文档说明。

4. 函数注释(Function Comments)

函数声明处注释描述函数功能,定义处描述函数实现。

函数声明:

注释于声明之前,描述函数功能及用法,注释使用描述式("Opens the file")而非指令式("Open the file");注释只是为了描述函数而不是告诉函数做什么。通常,注释不会描述函数如何实现,那是定义部分的事情。

函数声明处注释的内容:

1) inputs(输入)及outputs(输出);

2) 对类成员函数而言:函数调用期间对象是否需要保持引用参数,是否会释放这些参数;

3) 如果函数分配了空间,需要由调用者释放;

4) 参数是否可以为NULL;

5) 是否存在函数使用的性能隐忧(performance implications);

6) 如果函数是可重入的(re-entrant),其同步前提(synchronization assumptions)是什么?

举例如下:

// Returns an iterator for this table.  It is the client's
// responsibility to delete the iterator when it is done with it,
// and it must not use the iterator once the GargantuanTable object
// on which the iterator was created has been deleted.
//
// The iterator is initially positioned at the beginning of the table.
//
// This method is equivalent to:
// Iterator* iter = table->NewIterator();
// iter->Seek("");
// return iter;
// If you are going to immediately seek to another place in the
// returned iterator, it will be faster to use NewIterator()
// and avoid the extra seek.
Iterator* GetIterator() const;

但不要有无谓冗余或显而易见的注释,下面的注释就没有必要加上“returns false otherwise”,因为已经暗含其中了:

// Returns true if the table cannot hold any more entries.
bool IsTableFull();

注释构造/析构函数时,记住,读代码的人知道构造/析构函数是什么,所以“destroys this object”这样的注释是没有意义的。说明构造函数对参数做了什么(例如,是否是指针的所有者)以及析构函数清理了什么,如果都是无关紧要的内容,直接 省掉注释,析构函数前没有注释是很正常的。

函数定义:

每个函数定义时要以注释说明函数功能和实现要点,如使用的漂亮代码、实现的简要步骤、如此实现的理由、为什么前半部分要加锁而后半部分不需要。

不要从.h文件或其他地方的函数声明处直接复制注释,简要说明函数功能是可以的,但重点要放在如何实现上。

5. 变量注释(Variable Comments)

通常变量名本身足以很好说明变量用途,特定情况下,需要额外注释说明。

类数据成员:

每个类数据成员(也叫实例变量或成员变量)应注释说明用途,如果变量可以接受NULL或-1等警戒值(sentinel values),须说明之,如:

private:
// Keeps track of the total number of entries in the table.
// Used to ensure we do not go over the limit. -1 means
// that we don't yet know how many entries the table has.
int num_total_entries_;

全局变量(常量):

和数据成员相似,所有全局变量(常量)也应注释说明含义及用途,如:

// The total number of tests cases that we run through in this regression test.
const int kNumTestCases = 6;

6. 实现注释(Implementation Comments)

对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。

代码前注释:

出彩的或复杂的代码块前要加注释,如:

// Divide result by two, taking into account that x
// contains the carry from the add.
for (int i = 0; i < result->size(); i++) {
x = (x << 8) + (*result)[i];
(*result)[i] = x >> 1;
x &= 1;
}

行注释:

比较隐晦的地方要在行尾加入注释,可以在代码之后空两格加行尾注释,如:

// If we have enough memory, mmap the data portion too.
mmap_budget = max<int64>(0, mmap_budget - index_->length());
if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock))
return; // Error already logged.

注意,有两块注释描述这段代码,当函数返回时注释提及错误已经被记入日志。

前后相邻几行都有注释,可以适当调整使之可读性更好:

...
DoSomething(); // Comment here so the comments line up.
DoSomethingElseThatIsLonger(); // Comment here so there are two spaces between
// the code and the comment.
...

NULL、true/false、1、2、3……:

向函数传入、布尔值或整数时,要注释说明含义,或使用常量让代码望文知意,比较一下:

bool success = CalculateSomething(interesting_value,
10,
false,
NULL); // What are these arguments??

和:

bool success = CalculateSomething(interesting_value,
10, // Default base value.
false, // Not the first time we're calling this.
NULL); // No callback.

使用常量或描述性变量:

const int kDefaultBaseValue = 10;
const bool kFirstTimeCalling = false;
Callback *null_callback = NULL;
bool success = CalculateSomething(interesting_value,
kDefaultBaseValue,
kFirstTimeCalling,
null_callback);

不要:

注意永远不要用自然语言翻译代码作为注释,要假设读你代码的人C++比你强:D:

// Now go through the b array and make sure that if i occurs,
// the next element is i+1.
... // Geez. What a useless comment.

7. 标点、拼写和语法(Punctuation, Spelling and Grammar)

留意标点、拼写和语法,写的好的注释比差的要易读的多。

注释一般是包含适当大写和句点(.)的完整的句子,短一点的注释(如代码行尾的注释)可以随意点,依然要注意风格的一致性。完整的句子可读性更好,也可以说明该注释是完整的而不是一点不成熟的想法。

虽然被别人指出该用分号(semicolon)的时候用了逗号(comma)有点尴尬。清晰易读的代码还是很重要的,适当的标点、拼写和语法对此会有所帮助。

8. TODO注释(TODO Comments)

对那些临时的、短期的解决方案,或已经够好但并不完美的代码使用TODO注释。

这样的注释要使用全大写的字符串TODO,后面括号(parentheses)里加上你的大名、邮件地址等,还可以加上冒号(colon):目的是可以根据统一的TODO格式进行查找:

// TODO(kl@gmail.com): Use a "*" here for concatenation operator.
// TODO(Zeke) change this to use relations.

如果加上是为了在“将来某一天做某事”,可以加上一个特定的时间("Fix by November 2005")或事件("Remove this code when all clients can handle XML responses.")。

______________________________________

译者:注释也是比较人性化的约定了:

1. 关于注释风格,很多C++的coders更喜欢行注释,C coders或许对块注释依然情有独钟,或者在文件头大段大段的注释时使用块注释;

2. 文件注释可以炫耀你的成就,也是为了捅了篓子别人可以找你;

3. 注释要言简意赅,不要拖沓冗余,复杂的东西简单化和简单的东西复杂化都是要被鄙视的;

4. 对于Chinese coders来说,用英文注释还是用中文注释,it is a problem,但不管怎样,注释是为了让别人看懂,难道是为了炫耀编程语言之外的你的母语或外语水平吗;

5. 注释不要太乱,适当的缩进才会让人乐意看,但也没有必要规定注释从第几列开始(我自己写代码的时候总喜欢这样),UNIX/LINUX下还可以约定是使用tab还是space,个人倾向于space;

6. TODO很不错,有时候,注释确实是为了标记一些未完成的或完成的不尽如人意的地方,这样一搜索,就知道还有哪些活要干,日志都省了。

google template模板 google template 模板安装库文件,附带一个测试实例 立即下载

相关推荐

Google代码规范(C++)<中文>

经过译制Google的C++代码规范,内容很详细,可用作公司内部培训或个人使用。开源无风险经过译制Google的C++代码规范,内容很详细,可用作公司内部培训或个人使用。开源无风险

【Python开发手册】深入剖析Google Python开发规范:规范Python注释写作

在Python编程中,注释的作用不仅仅是解释函数或代码块的作用,还可以提高可读性、可维护性和表达代码意图的清晰性。正确书写Python注释,既是程序员的编程规范,更是提高代码质量的必要措施。因此,本文总结了Python注释的写法规范和注意事项,以及如何利用Pycharm代码模板快速生成规范注释的方法,帮助广大程序员提高代码质量和效率。

Zeeland的博客 1620

【银行测试】手机银行APP专项项目+测试点汇总(一)

1、手机银行APP转账项目讲解面试官:请介绍一下你所负责的模块如何进行的测试?求职者:好的,我最近测试的是XX银行的手机银行App项目。这个项目里面包含了转账、转账额度调整、网银转账、交易明细、添加账户、存款、投资理财、生活缴费等功能模块。我主要负责了转账模块,这个大模块中包含了智能转账、手机转账、语音转账、预约转账、收款人管理等5个子模块,我首先介绍一下我们生活中使用最多的手机转账子模块。对于转账需要关注的是转账前、转账中、转账后这三个状态下的测试。

m0_70102063的博客 1604

Python 编码规范 (Google)

分号 行长度 括号 缩进 空行 空格 Shebang 注释 类 字符串 文件和 sockets TODO 注释 导入格式 语句 访问控制 命名 Main

欢迎关注,共同进步! 877

Spark入门:从零到能跑的实战教程

Spark 的强大在于它统一了大数据处理的多种场景,从批处理到流处理,从 SQL 到机器学习。对于初学者来说,理解 Spark 的核心理念——内存计算和分布式抽象,是最重要的一步。接着,学会用 PySpark 搭建环境,能读数据、能写 SQL,基本上就入门了。剩下的路,就是通过实战去加深理解。写到这里,相信你对 Spark 已经有了一个比较完整的认识。下一步,不妨自己动手写几个 PySpark 脚本,跑一跑日志数据,或者尝试用 Spark SQL 做一个统计。

Morpheon的博客 1369

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

Python Google风格注释详解

Google风格注释是Python代码注释的一种标准化格式,它提供了一种规范的注释格式,使得代码更加易读、易于维护。Google风格注释使用三个双引号来包围注释内容,并按照一定规范编写。在注释中使用动词短语来描述函数的行为,并使用被动语态。在注释中使用正确的标点符号和缩进,使得注释易于阅读和理解。通过使用Google风格注释,我们可以为代码提供清晰的文档和说明,使得代码更加易读、易于维护。

旦莫的博客 1833

TSMC65nm工艺下Virtuoso仿真gm-id曲线的保姆级教程(含ADE设置详解)

本文提供了一份在TSMC 65nm工艺下使用Cadence Virtuoso绘制gm-id曲线的详细教程。内容涵盖从理解gm/id方法学、搭建仿真环境、深度解析ADE设置,到运行DC仿真、提取数据并生成对数坐标曲线的完整流程。教程重点解析了Virtuoso ADE中的关键设置与常见避坑点,旨在帮助模拟集成电路设计初学者快速掌握这一核心设计工具,为高性能电路设计奠定基础。

grpc6streamer的博客 1172

7. 注释

7. 注释¶<br />注释虽然写起来很痛苦, 但对保证代码可读性至关重要. 下面的规则描述了如何注释以及在哪儿注释. 当然也要记住: 注释固然很重要, 但最好的代码本身应该是自文档化. 有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字.<br />你写的注释是给代码读者看的: 下一个需要理解你的代码的人. 慷慨些吧, 下一个人可能就是你!7.1. 注释风格¶<br />Tip<br />使用 // 或 /**/, 统一就好.<br />// 或 /**/ 都可以; 但 //更 常用. 要在如

Richarll的专栏 836

SAP S4 MM模块自动记账全流程解析:从评估范围到科目分组的实战配置

本文深入解析SAP S4 MM模块自动记账的全流程,从核心概念评估范围与评估控制入手,详细阐述了评估类、科目分组等关键配置的逻辑关系。通过实战配置步骤,指导如何建立从物料移动(如收货、发料)到自动生成准确财务凭证的完整体系,确保库存价值与总账实时同步,为企业构建可靠的财务业务一体化基石。

weixin_29313547的博客 422

100天精通Python(爬虫篇)——第118天:selenium自动化操作浏览器基础大总结

一、Selenium框架环境搭建 1. 下载模块 2. 安装浏览器驱动WebDriver 二、基础操作 1. 打开浏览器 2. 无界面模式 3. 元素定位 4. 元素操作 5. 前进后退 6. 执行js 7.页面等待 隐式等待(常用) 显式等待(了解) 三、进阶操作 1. 使用代理ip 2. 修改请求头 3. 隐藏指纹特征.....................

努力让自己发光,对的人才能迎着光而来 10万+

[译]Google C++编程风格指南(六)

注释 注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、注释在哪儿。当然也要记住,注释的确很重要,但最好的代码本身就是文档(self-documenting),类型和变量命名意义明确要比通过注释解释模糊的命名好得多。 注释是为别人(下一个需要理解你的代码的人)而写的,认真点吧,那下一个人可能就是你! 1. 注释风格(Comment Style)

ziyou飞翔的专栏 839

使用lightGBM进行数据建模及预测

在机器学习领域中,数据建模和预测一直是非常重要的任务。而lightGBM作为一种基于梯度提升算法的高效机器学习框架,被广泛应用于数据建模和预测中。本文将介绍如何使用lightGBM进行数据建模和预测。到此,我们已经成功使用lightGBM对数据进行了建模和预测。使用lightGBM可以快速、高效地完成数据建模和预测任务,是机器学习领域中不可或缺的工具之一。使用lightGBM进行数据建模及预测。

qq_37934722的博客 1016

Google C++编程风格指南(六):代码注释

注释注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、注释在哪儿。当然也要记住,注释的确很重要,但最好的代码本身就是文档(self-documenting),类型和变量命名意义明确要比通过注释解释模糊的命名好得多。注释是为别人(下一个需要理解你的代码的人)而写的,认真点吧,那下一个人可能就是你!1. 注释风格(Comment Style)

周睿的博客(blog) 1045

R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值

R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)

statistics+insight+vista+power 1397

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Google C++编程风格指南(六):代码注释(转载)

注释<br />注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、注释在哪儿。当然也要记住,注释的确很重要,但最好的代码本身就是文档(self-documenting),类型和变量命名意义明确要比通过注释解释模糊的命名好得多。<br />注释是为别人(下一个需要理解你的代码的人)而写的,认真点吧,那下一个人可能就是你!<br />1. 注释风格(Comment Style)<br />使用// 或/* */ ,统一就好。<br />// 或/* */ 都可以,// 只

wulong710的专栏 745

温度PID控制PLC程序

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

Google C++ 开源风格指南

Google 在 C++ 编程中的代码风格规范、命名约定、注释要求和格式规定,提升代码的可读性、可维护性和规范性。

有耐心做好简单事情,坚持写blog 4192

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Google 编程风格:C++、Python、JavaScript、Shell、TypeScript

Google 编程风格:C++、Python、JavaScript、Shell、TypeScript

freeking101的博客 5万+

Google C++编程风格指南

  [译]Google C++编程风格指南(八)[完] 2008年09月03日 星期三 17:06 原文地址:Google C++ Style Guide 规则之例外前面说明的编码习惯基本是强制性的,但所有优秀的规则都允许例外。1. 现有不统一代码(Existing Non-conformant 阅读全文>> 类别:c

skyremember的专栏 1234

c++ google编程风格

简介 编码不易,每家公司都有它的脾气。 c++的编码风格也有不少流派,这里独选google,一是因为它牛逼,向牛逼的学习总没错,二是它有很多开源项目使用的就是这个风格。 当你不知道怎么做才好时,就先用google的吧,已经有无数前仁验证过了。 本文不是要再罗列一遍所有的细则,而是提炼出编码中随时需要使用的部分,作出总结,这样方便参考。 具体结节,还请稳步开源文档:C++ 风格指南。 头文件 使用 #define 保护,为保证唯一性,头文件的命名使用项目目录的全路径 避免使用前置声明,使用 #inclu

guotianqing的博客 1388

Google C++ 风格指南

背景介绍 风格指南的目标 C++ 版本 头文件 自包含头文件 #define 防护 包含所需内容 前置声明 在头文件中定义函数 头文件包含顺序与命名规范 作用域 命名空间 内部链接 非成员函数、静态成员函数与全局函数 局部变量 静态与全局变量 关于析构的决策 关于初始化的决策 常见模式 thread_local 变量 类 构造函数中的工作处理 隐式转换 可复制与可移动类型 优势 实现要点 注意事项 规范要求 结构体与类的选择 结构体 vs. 对组与元组 继承 运算符重载 访问控制 声明顺序 函数 输入与输出

AI工程化、开源分享、文档翻译、代码笔记 1443

Google C++编程规范 (中文版)

点击下面的超级链接即可: Google 开源项目风格指南  C++ 风格指南 - 内容目录 0. 扉页 0.1 译者前言 0.2 背景 1. 头文件 1.1. Self-contained 头文件 1.2. #define 保护 1.3. 前置声明 1.4. 内联函数 1.5. #include 的路径及顺序 译者 (YuleFox) 笔...

Hhrock的博客 3万+

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

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

程永强 2312

Google C++项目编程风格指南 (中文版) 分享

之前点击上方“AI算法与图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达导读这是一份来自Google开源的文档c++部分总共有 67 页,本文分享的内容,是基...

zero的博客 1575
上一篇: Google C++编程风格指南(四)
下一篇: Google C++编程风格指南(五)
olncy
博客等级 码龄20年 30粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值