zoukankan      html  css  js  c++  java
  • 《Google C++ 编码规范》小结

    前言:

        现在写代码,很多时候都是借鉴的别人的代码。而大家的代码风格都不同,很多时候我也会造成自己没有固定的代码风格。从网上找了这个《Google C++ 编码规范》,希望整理出自己的编码风格。

    ·头文件

      1.#define的保护:使用#ifndef <PROJECT>_<PATH>_<FILE>_H_,#define和#endif。

      2.头文件依赖:为了减少引入更多头文件,可多使用前置声明和使用指针成员。

      3.内联函数:10行内,不要包含循环和switch语句和虚函数及递归函数。

                      需小心析构函数--因为包含数据成员的释放。

      4.-inl.h文件:非必需的,用于是头文件更干净而将内联实现放在-inl.h文件中。

      5.函数参数顺序:输入参数在前,输出参数在后。

      6.包含文件的名称及次序:[同名.h]、C库、C++库、其他库的.h和项目内的.h。

                        同时在#include项目内.h问件时最好使用完整路径而避免使用.和..表示。

    ·作用域

      1.命名空间:提倡使用具名命名空间和在.cc文件中使用匿名命名空间来减少名字冲突。

      2.嵌套类:最好将嵌套类定义为public,除非是接口的一部分。

      3.非成员函数、静态成员函数和全局函数:尽量避免使用全局函数。

      4.局部变量:尽可能声明在最小作用域内,并在声明时就初始化。

                      还需要注意一点是避免在循环中定义变量。

      5.全局变量:class类型的全局变量应被禁止的,内建类型则允许。因为构造函数的调用无序性。

                      class类型全局变量的回避可以采用单例模式。全局字符串也采用C风格字符串。

                      静态成员变量也被视作全局变量,也应避免class类型。

    ·类

      1.构造函数的职责:只进行无实际意义的初始化,有意义的初始化放在函数init()中。

                             可在需要是增加成员标记对象是否已经初始化。

      2.默认构造函数:虽然编译器可提供默认构造函数,还需要自定定义一个。

      3.明确的构造函数:对单参数构造函数使用explicit。

      4.拷贝构造函数:STL容器要求所有内容可拷贝、可赋值--替代方法是使用指针容器。

                       当不需要拷贝构造函数时使用

                             #define DISALLOW_COPY_AND_ASSIGN(TypeName) \

                                  TypeName(const TypeName&);                       \

                                  void operator=(const TypeName&)

                        当拷贝时需要检测自赋值情况。

      5.结构体和类:仅当只有数据时使用struct,其它一概使用class。

      6.继承:使用组合通常比使用继承更适宜,如使用继承的话,只使用公共继承。

                 继承主要用于两个场合:实现继承和接口继承。

      7.多重继承:真正需要用到多重实现继承的时候非常少。

      8.接口:指满足特定条件的类,以Interface为后缀。

      9.操作符重载:除少数特定环境外,不要重载操作符--提供相应的函数替代。

      10.存取控制:一般为内联函数。数据成员obj_,取值和赋值函数名:obj(),set_obj()。

      11.声明次序:public:在private:前,成员函数在数据成员前。

                (typedefs和enums)>常量>构造析构函数>成员函数>数据成员>DISALLOW宏

      12.编写短小函数:倾向于选择短小、凝练的函数。

    ·google特有的风情

      1.智能指针:多使用智能指针--现在倾向于使用boost的智能指针。

    ·其他C++特性

      1.引用参数:引用参数前必须加上const。

      2.函数重载:仅在输入参数类型不同、功能相同时使用重载函数。

      3.缺省参数:禁止使用缺省函数参数。

      4.变长数组和alloca:存在内存泄漏的风险,不推荐使用。

      5.友元:允许合理使用友元类及友元函数。

      6.异常:不要使用C++异常。替代是使用错误代码和断言等。

      7.运行时类型识别:禁止使用RTTI。

      8.类型转换:使用C++风格类型转换函数,而避免使用C风格类型转换。

      9.流:只在记录日志时使用流。替代使用printf()和scanf()。

      10.前置自增和自减:可能的话尽量使用++i形式。

      11.const的使用:推荐常使用。

      12.整型:常用的是int,如需不同大小可使用<stdint.h>中定义的整型值(int16_t等)

                  如无必要,不推荐使用无符号整型。

      13.64位下的可移植性:

      14.预处理宏:使用宏时要谨慎,尽量以内联函数、枚举和常量代替。

      15.0和NULL:整数用0,实数用0.0,指针用NULL,字符串用'\0'。

      16.sizeof:尽可能用sizeof(varname)代替sizeof(type)。

      17.Boost库:只使用Boost库中被认可的库。

    ·命名约定

      1.通用命名规则:不要节约空间,名称应该更具有描述性。

      2.文件命名:全部小写,可含有下划线或短线。文件名也多以内部类命名。

      3.类型命名:每个单词首字母大写且不含下划线。类型有:类、结构体、typedef定义和枚举。

      4.变量命名:一律小写,单词间以下划线相连,类成员变量以下划线结尾。

                     结构体成员变量跟普通变量一样;而全局变量应少用,使用时可加前缀g_区分。

      5.常量命名:在名称前加k前缀,如kDaysInAWeek。

      6.函数命名:普通函数如void AddTableEntry()形式。

                      存取函数,如int num_entries_的存取函数num_entries()和set_num_entries。

      7.命名空间:全小写,如google_awesome_project。

      8.枚举命名:枚举值应全部大写,单词以下划线相连。

      9.宏命名:形式如MY_MACRO_LIKE_THIS.

      10.命名规则例外:参考现有或相近命名约定。

    ·注释:

      1.注释风格:使用//和/**/,统一就好

      2.文件注释:通常.h文件主要要说明功能和用法,而.cc文件则包含更多的实现细节和算法讨论。

      3.类注释:

      4.函数注释:

      5.变量注释:

      6.实现注释:

      7.标点、拼写和语法:

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

    ·格式

      1.行长度:不超过80.

      2.非ASCII字符:避免使用非ASCII字符,使用时要使用UTF-8格式。

      3.空格还是制表符:只使用空格,可设IDE将tab转为空格。

      4.函数声明和定义:

      5.函数调用:

      6.条件语句:

      7.循环和开关选择语句:

      8.指针和引用表达式:

      9.布尔表达式:

      10.函数返回值:return表达式中不要使用圆括号。

      11.变量及数组初始化:

      12.预处理指令:

      13.类格式:

      14.初始化列表:

      15.命名空间格式化:

      16.水平留白:

      17.垂直留白:

    ·规则之例外

      略

    ·团队合作

      略

  • 相关阅读:
    区分replace()和replaceAll()
    error:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    关于设计SQL表的一些问题
    SQL语句的学习理解
    error:安装手电筒程序后在打开程序后报错:你的camera flashlight正在被其他程序占据
    Error:Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package name 'com.fortythree.sos.flashlight'
    Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/adp;
    Android Studio 封装的类的继承
    Android SDK安装
    MongoDB探索之路(二)——系统设计之CRUD
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/2395897.html
Copyright © 2011-2022 走看看