欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

规则代码 , Google C++ Style 剖析篇(附图)

程序员文章站 2022-03-21 21:23:01
...

了解Google C++ Style

C ++是许多Google开源项目使用的主要开发语言之一。每个C ++程序员都知道,该语言具有许多强大的功能,但是这种功能带来了复杂性,这反过来会使代码更易于出错,并且更难以阅读和维护。

本指南的目的是通过详细描述编写C ++代码的注意事项来管理这种复杂性。这些规则的存在是为了使代码库易于管理,同时仍然允许编码人员有效地使用C ++语言功能。

样式(也称为可读性)是我们用来控制C ++代码的约定。术语“样式”有点用词不当,因为这些约定不仅涵盖源文件格式,还涉及更多内容。

Google C++ Style官方链接

图示Google C++ Style

规则代码 , Google C++ Style 剖析篇(附图)

代码测试其规则

HeadFile

//Copyright 2008 Goole Inc.      版权
//License (BSD/GPL/...)          许可证
//Author: Handling               作者
//This is Google C++ Style                    文章描述

#ifndef CPPPRIMER_GOOLESTYLE_H_        //防止重复包含 宏格式为:<project>_<path>_<file>_
#define CPPPRIMER_GOOLESTYLE_H_   
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
    TypeName(const TypeName&);              \
    TypeName& operator=(const TypeName&)



class Channel;                //头文件中尽量使用前置声明 ,STL例外不适用前置声明,使用#include  
class Channel {

};
__interface CallbackInterface
{

}; 
namespace mynamespace {                       //命名空间全小写,顶头无空格,cc文件中提倡使用不具名命名空间
class GoogleStyle : public CallbackInterface {  //访问限定符1空格缩进,类名大写开头字母,使用组合                                              //比使用继承更加适宜,若用继承,只使用共有继承。
                                               //接口命名以 Interface结尾
 public:         
   /* 每一个限定符内,声明顺序如下
   1.typedef 和 enums
   2.常量
   3.构造函数
   4.析构函数
   5.成员函数,含静态数据成员
   6.成员变量,含静态成员变量
   */
  typedef std::vector<int> IntVector;                      //2空格缩进
  enum UrlTableErrors {                                    //枚举命名与类名相同,大写开头字母
    ERROR_OUT_OF_MEMORY = 0,                               //枚举值2格缩进,全大写下划线组合
    ERROR_MALFORMED_INPUT,
  };
  GoogleStyle();
  explicit GoogleStyle(const int xx);                      //explict修饰单参数构造函数,防止隐式转换误用
           	                                               //若定义了成员变量但是无其他构造函数,需要定义一个默认构造函数

//普通函数命名,大写开头单词,输入参数在前为const引用,输出参数在后为指针,不为参数设置缺省值
  void Add(const std::string& input, Channel* output);
  
  //存取函数命名,取:同变量名,村:值函数名为set_varname,短小的存取函数可用内联修饰
  int num_entries() const { return num_entries_; }  //尽可能使用const
  void set_num_entries(int num_entries) { num_entries_ = num_entries; }
 
 private:
     //仅在需要拷贝对象时使用拷贝构造函数,不需要拷贝时在private使用DISALLOW_COPY_AND_ASSIGN宏
  DISALLOW_COPY_AND_ASSIGN(GoogleStyle);   
                                  
  //变量要用描述性名称,不要节约空间,让别人理解你的代码更重要
  
  const int kDaysInWeek = 7;      //const 变量为k开头,后跟大写开头单词
  int num_entries_;               //变量命名:全小写,有意义的单词和下划线,类成员变量下划线结尾
  int num_complated_connections_;

  Channel* channel_;           //头文件中只用了指针/引用,则前向声明而非引入头文件
};


bool DoSomething(int a,int b) {
  return false;
}
} // namespace mynamespace
#endif // !CPPPRIMER_GOOLESTYLE_H  保护宏结尾加注释


源文件

//Copyright 2020 Google Inc.
//License (BSD /GPL...)
//Author : Handling
//This is Google C++ Style
#include "goolestyle.h"         //本类的声明(第一个包含 h文件,有效减少依赖)
#include <sys/types.h>          //c库文件
#include <vector>              //c++库文件
#include <string>
#include <iostream>
#include <cassert>
//#include "base/basictypes.h" 其他库文件
//#include "foo/public/bar.h"  禁止使用unix文件路径 “.” 和 ".."

using std::string;               //可以在整个cc文件和h文件的方法内使用using 
using std::cout;                //禁止使用using namespace 污染命名空间

namespace mynamespace {

    //多行初始化列表,“:” 前4空格缩进,以“,”结尾,多个变量折行对齐,单行初始化列表 
    //Class::Class() : _var(xx) {}
    //构造函数中只进行那些没有实际意义的初始化
GoogleStyle::GoogleStyle()                   
    : num_entries_(10),
      num_complated_connections_(false) {
    
}

void GoogleStyle::Add(const std::string& input, //参数过多时","结尾,每行一个变量对齐
                      Channel* output) {
  bool retval = DoSomething(1, 2);           //传参中,","后空一个格
  bool condition = false;
  
  if (condition) {                           //条件括号内无空格,(condition)左右一空格,if执行体两空格缩进
    for (int i = 0; i < kDaysInWeek; ++i) {  //使用前置递增运算符
      if (i > i + 1 &&                        //条件变量过多时,&&结尾,条件下一行左对齐
          i + 3 == i + 4) {
          //TODO(name aaa@qq.com): xxx 临时方案使用TODO(大写)注释,括号里使用 名字加邮箱
      }
    }
  } else {                     //大括号与else同行,else左右空格
      auto j = GoogleStyle();  //尽量使用初始化时声明
  }
  switch (1) {                //(1)左右各1空格
    case 0: {                 //条件相对于 switch 2格缩进
      cout << "1";            //执行体 4格缩进
      break;
    }
    default: { 
      assert(false);          //default永不执行时使用assert
    }
  }
  return;                     //返回值不需要加括号
}






} // namespace mynamespace 命名空间结束

/* 
1.尽量不使用宏
2.不使用异常
3.禁止使用RTTI
4.使用printf之类的代替流
5.除位域不使用无符号数字
6.除特殊环境,不使用操作符重载
7.使用4种cast运算符类型转换
8.禁止使用  Class类型全局变量
9.若使用必须为单例模式
10.sizeof(var)代替sizeof(type)
11.scoped_ptr 可以胜任智能指针
12.特殊情况下可用shared_ptr
13.任何时候不使用auto_ptr
*/