规则代码 , Google C++ Style 剖析篇(附图)
程序员文章站
2022-03-21 21:23:01
...
Google C++ Style
了解Google C++ Style
C ++是许多Google开源项目使用的主要开发语言之一。每个C ++程序员都知道,该语言具有许多强大的功能,但是这种功能带来了复杂性,这反过来会使代码更易于出错,并且更难以阅读和维护。
本指南的目的是通过详细描述编写C ++代码的注意事项来管理这种复杂性。这些规则的存在是为了使代码库易于管理,同时仍然允许编码人员有效地使用C ++语言功能。
样式(也称为可读性)是我们用来控制C ++代码的约定。术语“样式”有点用词不当,因为这些约定不仅涵盖源文件格式,还涉及更多内容。
图示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
*/