C++Google编码风格学习

Posted Frank学习路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++Google编码风格学习相关的知识,希望对你有一定的参考价值。

Google规范线上地址:https://zh-google-styleguide.readthedocs.io/en/latest/

文章目录

1. 头文件

每个cpp/cc文件都对应一个h头文件,除单元测试代码和只包含main()的文件外。

所有头文件都应该有 #define 保护来防止头文件被多重包含,命名格式:<PROJECT>_<PATH>_<FILE>_H_,如:

#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_

当函数被声明为内联函数后,编译器会将其内联展开,而不是按通常的函数调用机制进行调用。(注意:只有当函数只有 10 行或者更少时才将其定义为内联函数)

使用标准的头文件包含顺序可增强可读性,避免隐藏依赖,顺序如下:相关头文件, C 库, C++ 库,其他库的.h,本项目内的.h

2. 作用域

命名空间将全局作用域细分为独立的,具名的作用域,可有效防止全局作用域的命名冲突。另外,一般在命名空间的最后注释出命名空间的名字。

3. 类

类是 C++ 中代码的基本单元。

在构造函数中可以进行各种初始化操作。

仅当只有数据成员时使用 struct,其它一概使用 class

接口是指满足特定条件的类,这些类以 Interface 为后缀 (不强制)。

4. 函数

函数使用时倾向于按值返回,否则按引用返回。避免返回指针,除非它可以为空。

函数最好简短、凝练,避免拖长尾。

所有按引用传递的参数必须加上const

若要使用函数重载,则必须能让读者一看调用点就胸有成竹,而不用花心思猜测调用的重载函数到底是哪一种,这一规则也适用于构造函数。

5. 其他C++特性

禁止使用 C++ 异常。

使用 C++ 的类型转换,如 static_cast<>()。不要使用 int y = (int)x 或 int y = int(x) 等转换方式。

强烈建议你在任何可能的情况下都要使用 const. 此外有时改用 C++11 推出的 constexpr 更好。

C++ 没有指定整型的大小。通常人们假定 short 是16位,int是32位,long是32位,long long是64位。

适当使用 lambda 表达式。别用默认 lambda 捕获,所有捕获都要显式写出来。

只使用 Boost 中被认可的库。

6. 命名约定

函数命名,变量命名,文件命名要有描述性,少用缩写。

文件名要全部小写,可以包含下划线(_)或连字符(-),依照项目的约定,如果没有约定,那么“”更好。

7. 注释

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

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

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

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

8. 格式

每一行代码字符数不超过80。

尽量不使用非 ASCII 字符,使用时必须使用UTF-8编码。

只使用空格,每次缩进2个空格。

倾向于不在圆括号内使用空格,关键字 ifelse 另起一行。

switch 语句可以使用大括号分段,以表明 cases 之间不是连在一起的。在单语句循环里,括号可用可不用。空循环体应使用或 continue

最后,请注意项目整体代码风格尽量保持一致,这样可以把精力集中在实现内容而不是表现形式上。

以上。

Google 编码风格之命名规范(备忘)

参考链接:http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/


通用规则:所有函数、变量、类与文件命名尽量不要使用缩写,以方便理解。除了不容易引起歧义的,如DNS等。


特殊规则:

1) 类的命名单词首字母使用大写且不能包含下划线;


函数命名类似,但是采用驼峰写法,首字母小写,后续的单词大写,中间不能有下划线,但如果您的某函数出错时就要直接 crash, 那么就在函数名加上 OrDie. 但对于取值和设值函数例外:


取值(Accessors)和设值(Mutators)函数要与存取的变量名匹配. 这儿摘录一个类, num_entries_ 是该类的实例变量:


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_;
;


2)所有变量命名都只能使用小写,单词与单词之间使用下划线间隔。类成员变量使用下划线结尾,函数的局部变量则不用下划线结尾;对于全局变量,在开头加上"g_",后续与前同;在Java当中,包package的命名需要使用小写字母。


3) 常量使用全部大写,而且单词与单词之间使用下划线隔开;


4) 非静态方法(实例方法)内调用另一个实例方法时,不需要画蛇添足地加this。但在以下的情况,需要显式写出this:

1)当在一个构造器中需要调用另一个构造器时,必须用到this的时候,需要添加this。

2) 需要return this的时候,则会在实例方法中显式地写出this。

3)需要初始化类成员的时候,需要显式写出this。


5) 初始化数组的时候,指定赋值数组时,记得在最后一个元素后加一个逗号",",原因是为了维护长数组。

如: 

int[] array_ = new int[]1,
                         2,
                         3,;

6) finialize()方法中,应该总是假设基类版本的finialize()也在做某些重要的事情,所以要用super来调用基类的finialize()函数。但需要添加异常处理来添加这个句子。

protected void finalize()
  if(!check_out)
    System.out.println("Error");
   
   super.finalize(); // you should add exception statement

7) 定义基类/ 抽象基类/ 接口的时候,为将来继承类/ 实现类/ 实现接口可能会抛出的异常占坑:


可以声明方法将抛出异常却不抛出的做法是允许的。这就涉及到一种良好的抽象基类/ 接口的编写方法:

为将来的派生类/ 实现接口能抛出这些已经在抽象基类/ 接口声明的异常,就在抽象基类/ 接口声明处加上异常抛出声明。


8/ 通常将一个类的数据成员设置为private,通过方法来引导客户端程序员访问数据成员。而且,基类和子类的数据成员的名字不宜相同。不然容易产生混淆。


9/ 我们一般规定:编写构造器时,避免调用其它的方法。如果调用,也只能调用private和final的方法。


以上是关于C++Google编码风格学习的主要内容,如果未能解决你的问题,请参考以下文章

一起学习下RT-Thread的C语言编码规范

一起学习下RT-Thread的C语言编码规范

<请教>我学了C语言的基本语法,现在想深入的学习C语言该咋学习? 要学来可以开发windows风格的程序。。。

Go语言学习之旅--初识GoLang

Go语言学习之旅--初识GoLang

《从零開始学Swift》学习笔记(Day60)——Core Foundation框架