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

了解Google C++ Style

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

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

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

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 [email protected]): 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
*/



猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/106424932
今日推荐