[C++] 编程实践之1: Google的C++代码风格7:注释

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

##注释
注释虽然写起来很痛苦,但对保证代码可读性至关重要。下面的规则描述了如何注释以及在哪儿注释。当然也要记住:注释固然很重要,但最好的代码本身应该是自文档化的。有意义的类型名和变量名,要远胜过要用注释解释的含糊不清的名字。

你写的注释是给下一个需要理解你的代码的人看的。慷慨些吧,下一个人可能就是你!

###注释风格

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

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

###文件注释

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

法律公告和作者信息:

  • 每个文件都应该包含以下项,依次是:
    • 版权声明(比如,Copyright 2008 Google Inc.)
    • 许可证。为项目选择合适的许可证版本(比如Apache 2.0, BSD, LGPL, GPL)
    • 作者:标识文件的原始作者
  • 如果你对原始作者的文件做了重大修改,将你的信息添加到作者信息里。这样当其他人对该文件有疑问时可以知道该联系谁。

文件内容:

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

###类注释

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

// 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 {
    ...
};

如果你觉得已经在文件顶部详细描述了该类,像直接简单的上来一句“完整描述见文件顶部”也不打紧,但务必确保有这类注释。

如果类有任何同步前提,文档说明之。如果该类的实例可被多线程访问,要特别注意文档说明多线程环境下相关的规则和常量使用。

###函数注释

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

函数声明:

  • 注释位于声明之前,对函数功能及用法进行描述。注释使用叙述式(“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;
  • 上面给出了一个具体示例。但是也要避免啰啰嗦嗦,或做些显而易见的说明。
  • 注释构造/析构函数时,切记读代码的人知道构造/析构函数是干啥的,所以“destroys this object”这样的注释是没有意义的。注明构造函数对参数做了什么(例如,是否取得指针所有权)以及析构函数清理了什么。如果都是些无关紧要的内容,直接省掉注释。析构函数前没有注释是很正常的。

函数定义:

  • 每个函数定义要用注释说明函数功能和实现要点。比如说说你用的编程技巧,实现的大致步骤,或者解释如此实现的理由。为什么前半部分要加锁而后半部分不需要等等之类的。
  • 不要从.h文件或其他地方的函数声明处直接复制注释。简要重述函数功能是可以的,但注释重点要放在如何实现上。

###变量注释

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

类数据成员:

  • 每个类数据成员(也叫实例变量或者成员变量)都应该用注释说明用途。如果变量可以接受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;

###实现注释

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

代码前注释:

  • 巧妙或者复杂的代码前要加以注释,比如:
// 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.
{ // 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,布尔值或者整数时,要注释说明含义,或使用常量让代码望文知义。例如对比:
// First version:
bool success = CalculateSomething(interesting_value,
                                  10,
                                  false,
                                  NULL);  // What are these arguments??
// Second version:
bool success = CalculateSomething(interesting_value,
                                  10,     // Default base value.
                                  false,  // Not the first time we're calling this.
// Third version:
const int kDefaultBaseValue = 10;
const bool kFirstTimeCalling = false;
Callback *null_callback = NULL;
bool success = CalculateSomething(interesting_value,
                                  kDefaultBaseValue,
                                  kFirstTimeCalling,
                                  null_callback);
                                  

不允许:

  • 注意永远不要用自然语言翻译代码作为注释。要假设读代码的人C++水平比你高,即使他/她可能不知道你的用意:
// Bad styles:
// 现在, 检查 b 数组并确保 i 是否存在,
// 下一个元素是 i+1.
...        // 天哪. 令人崩溃的注释.

###标点,拼写和语法

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

注释的通常写法是包含正确的大小写和结尾句号的完整语句。短一点的注释(如代码行尾注释)可以随意点,但依然要注意风格的一致性。完整的语句可读性更好,也可以说明该注释是完整的,而不是一些不成熟的想法。

虽然被别人指出该用分号时却用了逗号多少有些尴尬,但清晰易读的代码还是很重要的。正确的标点,拼写和语法对此会有帮助。

###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.”)。

###弃用注释

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

您可以写上包含全大写的DEPRECATED的注释,以标记某接口为弃用状态。注释可以放在接口声明前,或者同一行。

在DEPRECATED一词后,留下您的名字,邮箱地址以及括弧补充。

仅仅标记接口为DEPRECATED并不会让大家不约而同的弃用,您还得亲自主动修正调用点(callsites),或者是找个帮手。

修正好的代码应该不会再设计弃用接口点了,着实改用新接口点。如果您不知从何下手,可以找标记弃用注释的当事人一起商量。

###总结

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

相关推荐

【v4l2】在Android SDK中交叉编译v4l2-ctl

为调试Android设备中camera的相关功能,需要引入v4l2-ctl工具。由于厂商提供的Android SDK源码中未集成v4l2-utils(包含v4l2-ctl以及其它组件的工具包),故需要下载v4l2-utils源码,并在Android SDK中交叉编译生成v4l2-ctl可执行文件。本文讲述其过程步骤。

rentong123的博客 1322

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

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

olncy的专栏 818

GaN功率放大器设计避坑指南:从仿真到实测的Doherty PA完整流程(基于ADS 2023)

本文详细介绍了基于ADS 2023软件,从理论计算、电路仿真到版图后仿真的GaN Doherty功率放大器完整设计流程。文章聚焦C波段应用,深入剖析了负载调制网络设计、稳定性处理、版图电磁仿真等关键环节中的常见误区与工程折衷,为工程师提供了一套从设计到实测的实战避坑指南。

weixin_29238147的博客 529

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

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

潇汀 4万+

python实现ECMS算法

ECMS(Equivalent Consumption Minimization Strategy)算法是一种用于混合动力汽车能量管理系统的优化策略。它通过计算等效油耗来平衡电池电量消耗和燃油消耗,从而优化整体能耗。以下是一个简单的Python实现,用于演示ECMS算法的基本思想。这个实现假设了一个简单的混合动力汽车模型,其中电池电量和燃油消耗是主要的优化目标。

weixin_45570158的博客 922

中兴B860AV2.1-A刷机避坑指南:晶晨免拆神器+安卓7.1.2固件实测

本文提供中兴B860AV2.1-A机顶盒的详细刷机教程,重点介绍使用晶晨免拆神器配合安卓7.1.2线刷固件包的实操步骤。内容涵盖刷机前的硬件确认、工具准备、软件设置、烧录全过程监控及常见问题解决,旨在帮助用户安全、高效地完成刷机,规避变砖风险,释放设备潜力。

pytorch8learner的博客 746

7. 注释

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

Richarll的专栏 836

SKUA-GOCAD入门教程-第八节 线的创建与编辑7和8

本文介绍了曲线编辑操作的主要功能,包括曲线部分和区域的管理操作。在曲线部分操作方面,详细说明了如何合并、删除、移动和过滤曲线部分,支持精确或带公差的合并方式。在曲线区域操作方面,阐述了保留/删除区域点、移动区域点、保留/删除区域线段等操作。此外还介绍了节点连接功能,包括新增/删除连接、端点连接以及为曲线赋予地质特征的方法。

江洋大葱的博客 390

C++ Google代码风格

C++ Google代码风格0 index(扉页)0.0 声明0.1 译者前言0.2 背景headers(头文件)1.1 Self-contained 头文件1.2. #define 保护1.3. 前置声明1.4. 内联函数1.5. #include 的路径及顺序译者(acgtyrant)笔记scoping(作用域)2. 作用域2.1. 命名空间2.2. 匿名命名空间和静态变量2.3. 非成员函数...

baidu_28926495的博客 1623

微信小程序 - error_msg:net::ERR_CONNECTION_RESET“(“errno“:600001,“errMsg“:“uploadFile:fail errcode:-101)

"errno":600001,"errMsg":"uploadFile:fail errcode:-101 cronet_error_code:-101 error_msg:net::ERR_CONNECTION_RESET"微信小程序,微信小程序wx.uploadFile报错,uniapp微信小程序uni.uploadFile上传文件报错,微信小程序调用wx.uploadFile返回错误ERR_CONNECTION_RESET,如何解决这个问题,上传图片出现报错,小程序上传视频报错,上传文件出现报错,如何

🏆 前端领域优质创作者 5408

【100%通过率】华为OD机试真题 C++ 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 9946

Abseil代码风格指南:Google C++代码规范的实践

在现代软件开发中,代码风格一致性是保证项目可维护性和可读性的关键因素。Google的C++代码规范被业界广泛认可,而Abseil库正是这一规范的完美实践。作为Google内部C++代码库的开源版本,Abseil不仅提供了高质量的C++组件,更展示了如何在实际项目中应用Google的代码风格规范。 本文将深入解析Abseil代码库中的风格实践,帮助开发者理解和应用这些最佳实践。 ## 命名约定:...

gitblog_00685的博客 984

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

xiaoyaGrace的博客 309

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

BAML C++ SDK 代码风格指南:Google 布局与标准库命名的工程实践

本文以 [baml_language/sdks/cpp/STYLE.md](https://link.gitcode.com/i/51b97241bd9f795a24c743a694047dac) 为骨架,系统讲解 BAML C++ SDK 的代码风格约定:布局(Layout)采用 Google 风格,命名(Naming)遵循 C++ 标准库的下划线风格,以及这套约定背后的源码级实现与例外条款。读

gitblog_00688的博客 389

C语言Google代码风格整理

想要写出整洁的代码就不得不遵循某种特定规范,在这篇文章中整理了C语言的Google代码规范。推荐刚刚接触代码的新手或是已经入门但是苦于代码编写风格的开发者阅读。

Reed_redd的博客 1197

Google C++编程风格指南

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

skyremember的专栏 1234

《GOOGLE C++ 编程规范》读书笔记

GOOGLE C++ 规范读书笔记 1、头文件 1、使用#define避免头文件被重复包含,定义的宏为全路径+文件名; 2、能使用前置声明的地方尽量不使用#include。即如果不需要访问类定义的情况下,使用类的前置声明即可;需要类定义时,则必须得包含头文件。 3、只有当函数只有10行甚至更少时才将其定义为内联函数;内联包含循环或switch语句的函数常常是得不尝失(除非在大多数情况下

pointersky的专栏 989

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

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

sjc2870的博客 465

数据简化社区Google和Linux代码风格指南(附PDF公号发“代码风格”下载)

数据简化社区Google和Linux代码风格指南(附PDF公号发“代码风格”下载) 秦陇纪2019代码类 数据简化DataSimp 昨天 ...

chiping4826的博客 630

【C++】基础:Google编码风格学习

当函数被声明为内联函数后,编译器会将其内联展开,而不是按通常的函数调用机制进行调用。命名空间将全局作用域细分为独立的,具名的作用域,可有效防止全局作用域的命名冲突。通常人们假定 short 是16位,int是32位,long是32位,long long是64位。若要使用函数重载,则必须能让读者一看调用点就胸有成竹,而不用花心思猜测调用的重载函数到底是哪一种,这一规则也适用于构造函数。函数声明处的注释描述函数功能,定义处的注释描述函数实现。函数命名,变量命名,文件命名要有描述性,少用缩写。

DevFrank的博客 3334

Google c++编程规范-----注释

在我写一起学c++(二)中说道注释的重要性,特意找了Google c++编程规范给大家参考。希望能对大家有所帮助,并且在以后为大家继续更新相应的规范要求   注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、 注释在哪儿。当然也要记住,注释的确很重要,但最好的代码 本身就是文档( self- documenting ) ,类型和变量命名意义明确要比通过注释解释

u011909633的专栏 1207

编码风格之(7)C++语言规范(Google风格)2

返回类型与函数名称在同一行,参数在同一行(如果合适)。将无法放在一行的参数列表换行,就像在函数调用中换行参数一样。.........需要注意的几点:选择好的参数名称。仅当函数定义中未使用该参数时,才可以省略参数名称。如果无法将返回类型和函数名称放在一行中,请在它们之间换行。如果在函数声明或定义的返回类型后换行,请不要缩进。左括号始终与函数名称在同一行。函数名称和左括号之间永远没有空格。括号和参数之间永远没有空格。左花括号始终位于函数声明最后一行的末尾,而不是下一行的开头。

梅花香自苦寒来,宝剑锋从磨砺出。 2144
上一篇: [C++] 编程实践之1: Google的C++代码风格6:命名约定
下一篇: [C++] 编程实践之1: Google的C++代码风格8:格式
魔豆Magicbean
博客等级 码龄19年 146粉丝 742原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值