Google关于C++开源项目的规范

一、头文件规范

    1. 每一个cpp文件对应都有.h文件。除非cpp文件很简单或者值包含了main函数。

    2. 每一个头文件都定义自己的头文件保护,防止重复引用和编译。

    3. 一般都用#include而不是前向定义,除非include的代价过大。

    4. 函数定义如果超过10行,坚决不能inline。

    5. 函数参数排序,从input到output。

    6. #include顺序:先写标准库的应用,然后写其他库的#include,最后写#include自己头文件。

二、作用域

    1. 使用using std::cout而不是using namespace std

    2. 自己写namespace的时候在cpp文件中写无名的,h文件中写有名字的namespace。

    3. 没有不得不写的的理由时候都不写内部类。

    4. 尽量用其他方法(比如static)来替代全局的方法。

    5. 使用的时候定义方法的变量,且定义时必须初始化。

    6. 除非是const,不然不要定义成全局的变量。

三、类

    1. 避免在构造方法内执行复杂的初始化工作,特别是可能失败的初始化或者调用虚方法。

    2. 为每个类都定义默认的构造方法。

    3. 所有只有一个参数的构造方法都加上explicit关键字。

    4. 提供赋值和复制构造方法,否则显示声明DISALLOW_COPY_AND_ASSIGN。

    5. 只用struct存储数据,而不是用它来定义类。

    6. 可以合成类时不用继承。如果继承尽量public。

    7. 有充分的理由才用多继承,比如每个父类都有至少一个方法在此类实现。或者有父类是纯虚类。

    8. 纯虚类以interface后缀结束,便于理解。

    9. 尽量少定义操作符重载。

    10. 成员变量尽量private保持封装。对于变量的获取,比如 foo变量,获取foo的方法命名成see_foo或者get_foo的风格。

    11. 声明顺序,先public后private,先方法后成员变量。

    12. 用指针的时候用scoped_ptr,对象的指针用std::tr1::shared_ptr,不要用auto_ptr。

    13. 可以使用cpplint.py工具来规范格式。

四、其他

    1. 所有的引用形参都定义成const。

    2. 函数重载的时候不要定义得ambiguous。

    3. 少用默认参数的函数,可以用重载来代替。

    4. 少依赖于exception机制,少依赖运行时确定的类型。

    5. 使用 static_cast<>而不是 int y = (int)x的类型转换方式。

    6. 使用++i而不是i++的风格。

    7. 不打算改变的就定义成const。

    8. 使用0.0 for float,nullptr or NULL for 指针,"" for char。

    9. 用sizeof(name)优于sizeof(type)。

五、命名

    1. 总的来说,文件、变量、方法名都要具有描述性。避免缩写。方法用动词,变量和文件用名词。

    2. 文件命名,小写,词间用_连接。

    3. 类型名写成MyExcitingClass这样的格式。

    4. 变量写成my_exciting_local_variable这样的格式。

    5. const变量写成以k为前缀个格式kDaysInAWeek。

    6. 方法名set_my_exciting_member_variable()。

    7. 命名空间都小写,最好和类与目录相关google_awesome_project。

    8. 宏定义MY_MACRO_THAT_SCARES_SMALL_CHILDREN。

    9. 枚举类似const kEnumName。

六、注释(看过别人代码都懂,没有注释有多蛋碎)

    1. 用//或者都可以,但是要一直用一种。

    2. 文件注释,通常是表面文件后对此文件进行描述。

    3. 每个类都有注释,说名类的作用和如何使用。

    4. 方法的注释如下面的例子(从参数到返回,功能)

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

    5. 变量通常命名已经相当于注释,但是有时候还是要注释。

七、格式

    1. 每行代码最好不要超过80个字符。

    2. 缩进规则(这个无所谓吧tab,space都可以)。

    3. 方法定义时,返回类型和参数尽量保持在同一行。

    4. 条件语句else关键字独占一行。

    5. 循环中即使是空也要{},即使只有一条语句也最好用{}。

    6. return是能不用()就不用。

    7. 对于函数的参数一行写不了的时候,写在下一行必须要有正确的缩进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值