《Google C++ 风格指南》阅读笔记

目录

Google C++ Style Guide》
中文翻译版:《Google C++ 风格指南
另,有一篇博文分析这篇风格指南,文章写得不错,文章后面的评论更值得一看,讨论异常和错误码的问题:《解读google C++ code style谈对C++的理解{#viewpost1_TitleUrl}》
全文包含很多内容,我主要关注三点:命名方式、注释方法、代码格式。这三点看似很小,每次编码都给我带来不少的麻烦,比如,这个到底该怎么命名,注释到底该写些什么等等。

1. 名字

名字是个大问题,最令语文与英语一样槽糕的我头疼。想起之前玩《魔兽世界》时给角色起名每次都纠结半天,没有文字功底,缺少创造力。
通用规则:小心使用缩写!永远不用省略字母的缩写。变量和函数用名词,函数可用动词。
意思就是尽量完整地表述元素的含义,而不要用只有自己才能看懂的方式来编码。
文件命名:小写字母,用-或_连接。
类型命名:每个单词首字母大写,不用下划线连接。类型包括类, 结构体, 类型定义 (typedef), 枚举等。
变量命名:小写字母,用下划线连接。类的成员变量以下划线结尾(这要求不知道有啥用处)。结构体中的变量可不用下划线结尾。
常量命名:以小写k开头,后接大写首字母。
函数命名:常规函数用每个单词首字母大写,不用下划线。取值和设值函数,与变量名匹配。
[cpp]
class MyClass {
public:

int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
[/cpp]
短小的内联函数可以用小写字母。
名字空间命名:用小写字母加下划线,基于项目名称和目录。
枚举命名:与常量或宏一致。
宏命名:你并不打算 使用宏, 对吧? 如果你一定要用, 像这样命名: MY_MACRO_THAT_SCARES_SMALL_CHILDREN 。
特例:如果你命名的实体与已有 C/C++ 实体相似, 可参考现有命名策略。

2. 注释

注释太重要了,可我就是不太会写这东西,不知道格式,看了一些代码,发现它们的注释格式都不相同,没有个清晰的指导方法。这篇指南给我指了个很清晰的方向。
注释风格:无论用 // 或 /* */ ,全体统一即可。
文件注释:版权公告,内容描述。.h文件做简单说明,.cpp文件详细说明,无需复制注释内容。
类注释:每个定义都要附带一份注释,描述类功能和用法。
函数注释:声明处描述函数功能,定义处描述函数实现。
函数声明处注释的内容:

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

切记,简单易懂无关紧要的地方不需要注释,比如析构函数可以没有注释。
函数定义部分要用注释说明函数功能和实现的要点。
变量注释:变量名可以很好地说明变量的用途。可加额外注释。
每个类数据成员和全局变量都应该注释。(在变量定义的上面加注释)
实现注释:对于巧妙、复杂、重要的地方加注释。
注意:要始终假设读代码的人C++水平比你高!
代码前注释:
行注释: 行尾空两格。连续多行可以对齐。
NULL,true/false,1,2,3,…:要说明含义。更好的方法时将其用常量表示。
TODO注释:可在圆括号中叫上自己的姓名和联系方式。还可加上时间等其他一切必要信息。

3. 格式

代码格式千奇百怪,就算是自己写的,前后也可能不一样。还是应该寻找一个固定的格式,这样便于以后重新理解并修改代码。
行长度:不超过80字符。满足编辑器窗口宽度即可。
非ASCII字符:尽量不使用非ASCII字符,使用时用UTF-8编码。处理中文咱用UTF-8么?
空格还是制表符:空格,每个缩进2个空格。制表符各个系统不同,还是不要用了。
函数声明与定义:返回类型和函数名在同一行,参数尽量在同一行。如果有些参数没有用到, 在函数定义处将参数名注释起来。
函数调用:尽量放在同一行。
条件语句: if和左圆括号,右圆括号与左大括号之间用空格,圆括号内是否有空格都可以。关键词else另起一行。若使用大括号,则所有分支都要加上。
循环和开关选择语句:switch可以用大括号分段,空循环体应用{}或continue。应该用default语句,如果应该永远都执行不到,可以加assert语句。
指针和引用表达式:句点或箭头前后不要有空格. 指针/地址操作符 (*, &) 之后不能有空格。在声明指针变量或参数时, 星号与类型或变量名紧挨都可以,不能两边都有空格。
布尔表达式:如果一个布尔表达式超过 标准行宽, 断行方式要统一一下。
函数返回值:return不用圆括号。
变量及数组初始化:用=或()均可。
预处理指令:不要缩进,从行首开始。这点我之前用的一直不好,千万不能加缩进,否则不明显。
类格式:访问控制块的声明依次序是 public:, protected:, private:, 每次缩进 1 个空格。这与C++编程思想中不同,该书中建议利用class默认private的性质,把私有成员放在开头。
[cpp]
class MyClass : public OtherClass {
public: // Note the 1 space indent!
MyClass(); // Regular 2 space indent.
explicit MyClass(int var);
~MyClass() {}
void SomeFunction();
void SomeFunctionThatDoesNothing() {
}
void set_some_var(int var) { some_var_ = var; }
int some_var() const { return some_var_; }
private:
bool SomeInternalFunction();
int some_var_;
int some_other_var_;
DISALLOW_COPY_AND_ASSIGN(MyClass);
};
[/cpp]
关键词pulic等要缩进1个空格,附加下声明顺序,每个区段内的声明通常按以下顺序:

初始化列表:放在同一行,或按四格缩进并列几行。
[cpp]
// When it requires multiple lines, indent 4 spaces, putting the colon on
// the first initializer line:
MyClass::MyClass(int var)
some_var_(var), // 4 space indent
some_other_var_(var + 1) { // lined up

DoSomething();

}
[/cpp]
名字空间格式化:内容不缩进。吐槽下MSVC的编辑器,每次都要缩进。
水平留白:水平留白的使用因地制宜.。永远不要在行尾添加没意义的留白。
垂直留白:越少越好。
注意:函数首尾不要有空行。代码块首尾不要用空行。if-else 块之间空一行是可以接受的。
 
上面三个部分关于格式,Google C++风格指南还有更多编码建议,很值得细细研读,找时间再把剩下的部分好好读一下。