Google C++ 编程风格指南:注释

别再傻傻分不清了!钕铁硼磁铁牌号里的H、UH、EH到底啥区别?从Hcb和Hcj说起 本文深入解析钕铁硼磁铁牌号中H、UH、EH等后缀的抗退磁能力差异,从Hcb和Hcj的核心指标出发,帮助工程师正确选型。通过对比不同后缀的Hcj最小值和工作温度,揭示常见选型误区,并提供工程选型的黄金法则和成本优化技巧,确保设备长期可靠性。 阅读详情

Google C++ 编程风格指南:注释

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

// 或 /* */ 都可以; 但 // 更 常用. 要在如何注释及注释风格上确保统一.

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

法律公告和作者信息:
每个文件都应该包含以下项, 依次是:

版权声明 (比如, Copyright 2008 Google Inc.)
许可证. 为项目选择合适的许可证版本 (比如, Apache 2.0, BSD, LGPL, GPL)
作者: 标识文件的原始作者.

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

文件内容:
紧接着版权许可和作者信息之后, 每个文件都要用注释描述文件内容.
通常, .h 文件要对所声明的类的功能和用法作简单说明. .cc 文件通常包含了更多的实现细节或算法技巧讨论, 如果你感觉这些实现细节或算法技巧讨论对于理解 .h 文件有帮助, 可以将该注释挪到 .h, 并在 .cc 中指出文档在 .h.
不要简单的在 .h 和 .cc 间复制注释. 这种偏离了注释的实际意义.

7.3. 类注释
每个类的定义都要附带一份注释, 描述类的功能和用法.

// 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 { …};
如果你觉得已经在文件顶部详细描述了该类, 想直接简单的来上一句 “完整描述见文件顶部” 也不打紧, 但务必确保有这类注释.
如果类有任何同步前提, 文档说明之. 如果该类的实例可被多线程访问, 要特别注意文档说明多线程环境下相关的规则和常量使用.

7.4. 函数注释
函数声明处注释描述函数功能; 定义处描述函数实现.

函数声明:
注释位于声明之前, 对函数功能及用法进行描述. 注释使用叙述式 (“Opens the file”) 而非指令式 (“Open the file”); 注释只是为了描述函数, 而不是命令函数做什么. 通常, 注释不会描述函数如何工作. 那是函数定义部分的事情.

函数声明处注释的内容:

函数的输入输出.
对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数.
如果函数分配了空间, 需要由调用者释放.
参数是否可以为 NULL.
是否存在函数使用上的性能隐患.
如果函数是可重入的, 其同步前提是什么?

举例如下:

// 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 文件或其他地方的函数声明处直接复制注释. 简要重述函数功能是可以的, 但注释重点要放在如何实现上.

7.5. 变量注释
通常变量名本身足以很好说明变量用途. 某些情况下, 也需要额外的注释说明.

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

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;

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

代码前注释:
巧妙或复杂的代码段前要加注释. 比如:

// 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); (*result) = x >> 1; x &= 1;}
行注释:
比较隐晦的地方要在行尾加入注释. 在行尾空两格进行注释. 比如:

// If we have enough memory, mmap the data portion too.mmap_budget = max(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.{ // One space before comment when opening a new scope is allowed, // thus the comment lines up with the following comments and code. DoSomethingElse(); // Two spaces before line comments normally.}
NULL, true/false, 1, 2, 3…:
向函数传入 NULL, 布尔值或整数时, 要注释说明含义, 或使用常量让代码望文知意. 例如, 对比:

Warning

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++ 水平比你高, 即便他/她可能不知道你的用意:

Warning

// 现在, 检查 b 数组并确保 i 是否存在,// 下一个元素是 i+1… // 天哪. 令人崩溃的注释.

7.7. 标点, 拼写和语法
注意标点, 拼写和语法; 写的好的注释比差的要易读的多.

注释的通常写法是包含正确大小写和结尾句号的完整语句. 短一点的注释 (如代码行尾注释) 可以随意点, 依然要注意风格的一致性. 完整的语句可读性更好, 也可以说明该注释是完整的, 而不是一些不成熟的想法.
虽然被别人指出该用分号时却用了逗号多少有些尴尬, 但清晰易读的代码还是很重要的. 正确的标点, 拼写和语法对此会有所帮助.

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

TODO 注释要使用全大写的字符串 TODO, 在随后的圆括号里写上你的大名, 邮件地址, 或其它身份标识. 冒号是可选的. 主要目的是让添加注释的人 (也是可以请求提供更多细节的人) 可根据规范的 TODO格式进行查找. 添加 TODO 注释并不意味着你要自己来修正.
// TODO(kl@gmail.com): Use a “*” here for concatenation operator.// TODO(Zeke) change this to use relations.
如果加 TODO 是为了在 “将来某一天做某事”, 可以附上一个非常明确的时间 “Fix by November 2005”), 或者一个明确的事项 (“Remove this code when all clients can handle XML responses.”).

7.9. 弃用注释
通过弃用注释(DEPRECATED comments)以标记某接口点(interface points)已弃用。

您可以写上包含全大写的 DEPRECATED 的注释,以标记某接口为弃用状态。注释可以放在接口声明前,或者同一行。
在 DEPRECATED 一词后,留下您的名字,邮箱地址以及括号补充。
仅仅标记接口为 DEPRECATED 并不会让大家不约而同地弃用,您还得亲自主动修正调用点(callsites),或是找个帮手。
修正好的代码应该不会再涉及弃用接口点了,着实改用新接口点。如果您不知从何下手,可以找标记弃用注释的当事人一起商量。

译者 (YuleFox) 笔记
关于注释风格,很多 C++ 的 coders 更喜欢行注释, C coders 或许对块注释依然情有独钟, 或者在文件头大段大段的注释时使用块注释;
文件注释可以炫耀你的成就, 也是为了捅了篓子别人可以找你;
注释要言简意赅, 不要拖沓冗余, 复杂的东西简单化和简单的东西复杂化都是要被鄙视的;
对于 Chinese coders 来说, 用英文注释还是用中文注释, it is a problem, 但不管怎样, 注释是为了让别人看懂, 难道是为了炫耀编程语言之外的你的母语或外语水平吗;
注释不要太乱, 适当的缩进才会让人乐意看. 但也没有必要规定注释从第几列开始 (我自己写代码的时候总喜欢这样), UNIX/LINUX 下还可以约定是使用 tab 还是 space, 个人倾向于 space;
TODO 很不错, 有时候, 注释确实是为了标记一些未完成的或完成的不尽如人意的地方, 这样一搜索, 就知道还有哪些活要干, 日志都省了.

推荐自学教程:http://yun.itheima.com/course/520.html?mcgcsdn

Google C++Style Guide【C++编程风格指南解读】——注释 注释虽然写起来很痛苦, 但对保证代码可读性至关重要. 下面的规则描述了如何注释以及在哪儿注释. 当然也要记住: 注释固然很重要, 但最好的代码本身应该是自文档化. 有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字. 1:使用 // 或 /* */, 统一就好. 解读:个人觉得//会比较方便一点~ 2:在每一个文件开头加入版权公告, 然后是文件内容描述. 解读: 阅读详情

相关推荐

Google-C++编码规范中文版(最新整理PDF版)

自己最新整理的Google代码规范,方便大家学习使用,可以节省大家整理时间。

C++ 注释风格

注释风格 注释风格可以根据自己的个人习惯来定,但关键是要统一,为了制定出统一的注释风格所以采用Doxygen注释风格。 使用Doxygen软件可以很方便的生成函数描述文档。 DoxyGen常用命令 命令 生成字段名 说明 @file 文件名 @autho...

AI.PLAY 1455

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析

本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。

weixin_29227425的博客 530

Google 的 C++编程规范

Google 的C++编程规范及C++类型推导;

weixin_44835655的博客 2097

STM32串口通信实战:从CubeMX配置到printf重定向全解析

串口通信是嵌入式系统中最基础且广泛使用的数据交换方式,它基于异步串行通信原理,通过TX(发送)和RX(接收)两根信号线实现设备间的全双工通信。其技术价值在于协议简单、硬件成本低、可靠性高,是单片机与上位机调试、传感器数据采集、设备控制等场景的首选方案。在STM32等ARM Cortex-M系列MCU中,USART外设通过硬件自动处理时序,大大减轻了CPU负担。本文聚焦于嵌入式竞赛与开发中的高频需求,以STM32G431RBT6为例,详解通过CubeMX配置USART1、实现按键触发数据发送、并完成print

weixin_30603633的博客 548

C# HttpClient 实战:3步绕过Cloudflare指纹拦截,获取完整网页内容

本文详细介绍了如何使用C# HttpClient绕过Cloudflare指纹拦截,获取完整网页内容的3步实战方案。通过完美复制浏览器请求头、智能管理Cookie容器以及处理动态挑战页面,开发者可以有效突破Cloudflare的反爬机制,适用于爬虫开发和数据采集项目。

weixin_31856057的博客 321

#编码风格# #Google C++# 注释(Comments)

目录 注释风格(Comment Style) 文件注释(File Comments) 类注释(Class Comments) 函数注释(Function Comments) 变量注释(Variable Comments) 以空、真/假、数字作为参数(NULL、true/false、1,2,3…) 注释的标点、拼写和语法 (Punctuation,Spelling and Gramma...

潇汀 4万+

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

python注释google规范

致谢: https://google.github.io/styleguide/pyguide.html https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/ http://legacy.python.org/dev/peps/pep-0008...

lzp_k2的专栏 5937

Ubuntu1804 关于ubuntu18.04下载软件仓库信息失败,请检查网络连接 的解决方案

今天电脑在更换软件源的时候遇到了这个问题。出现了如上图所示的错误信息。 尝试了各家优快云的博客之后,发现方法大同小异,均无法解决。 方法大多都是要求更换软件源,如下所示: 打开“Ubuntu软件中心”-->点击“编辑”-->点击“软件源”-->在Ubuntu软件界面,“下载自”默认是“中国的服务器”,改为“主服务器”试试 2.打开更新管理器-》设置-》选择站点-》...

weixin_43729409的博客 1万+

android 如何分析应用的内存(十六)——使用AS查看Android堆

在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。本文将介绍,如何查看堆中的内容。

安仔的博客 4254

Google C++编程风格指南阅读笔记之命名、注释和格式

前言 本文源自Google C++编程风格指南,砍掉了其中比较common的部分,保留了个人认为最有价值的部分,并合入了自己的理解。原文下载连接:Google C++编程风格指南 命名约定 类型命名 类型名称的每个单词首字母均大写,不包含下划线如:MyExecitingClass,IOService 变量命名 变量名一律小写,单词之间使用下划线连接。类和结构体的成员变量以m_开头(原文是类的成员变量以_结尾,结构体不用) 枚举命名 枚举的命名应当和宏一致 宏的命名 宏的命名使用全大写字母加下划线,如MY_M

sjc2870的博客 466

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

Google C++编程风格指南之代码注释

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

望尽天涯路的博客 699

STM32G0/G4电机控制中三角函数与浮点运算优化实战

三角函数(sin/cos)和浮点运算是电机矢量控制(FOC)的核心基础,直接影响Clark/Park变换、SVPWM及观测器的实时性与精度。在资源受限的MCU上,标准math.h库因无硬件FPU支持而引发严重时序抖动,导致电流环延迟、转矩脉动增大甚至系统复位。通过硬件加速(如STM32G4的CORDIC协处理器)或定制化定点算法(如STM32G0的查表+线性插值),可将sin/cos计算从数十微秒压缩至1–3 μs量级,提升30倍以上效率。该方案广泛适用于BLDC/PMSM驱动、伺服控制及高动态响应嵌入式运

weixin_35751412的博客 110

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

周睿的博客(blog) 1045

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

探索《Google C++编程风格指南》中文版:优化代码质量的新里程

探索《Google C++编程风格指南》中文版:优化代码质量的新里程 在软件开发的世界里,遵循一套良好的编程规范是提升代码可读性、可维护性和团队协作效率的关键。为此,我们向您推荐一个非常有价值的项目——《Google C++编程风格指南》中文版。该项目是Google官方C++编程风格指南的汉化版本,旨在帮助中文开发者更好地理解和应用这一国际知名的技术标准。 项目简介 该项目的目标是将Google内...

gitblog_00059的博客 591

C++ 风格指南

C++ 风格指南

zhaominyong的专栏 1044

Google C++编程风格指南

Google C++编程风格指南(一) 背景 Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。 本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。 风格,也被视为可读

1512

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

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

wulong710的专栏 745

Google C++编程风格指南(非常有用)

Google C++编程风格指南(一) 背景 Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。 本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。

4782
上一篇: 初学者学习python的几个建议
下一篇: Java语言中的异常处理
Tableau1
博客等级 码龄8年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值