版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GG_SiMiDa/article/details/82853420
c++style指南
参考[google c++风格指南]https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/
代码示例
#ifndef PROJECT_PATH_FILE_H
#define PROJECT_PATH_FILE_H
// 源文件中首先包含对应头文件
// #include "对应头文件"
#include <c标准头文件>
#include <c++标准头文件>
#include "依赖库头文件"
#include "本项目头文件"
// 避免直接使用using namespace foo;
using std::string;
using foo::bar;
namespace ns {
extern Type g_var; // 全局变量加g_前缀
typedef struct point_s {
int x;
int y;
} point_t;
class LoginInterface {
virtual int Login() = 0;
virtual int Logout() = 0;
};
class ClassName {
public:
enum ContentType {
UNKOWN = 0,
TEXT_XML,
TEXT_JSON,
X_WWW_FORM_URLENCODED,
};
ClassName();
~ClassName();
ClassName(ClassName& rhs)
ClassName& operator=(ClassName& rhs);
string Username() const {
return _username;
}
void SetUsername(string username) {
_username = username;
}
// 静态成员函数
static void Init();
static void DeInit();
// public函数我们推荐使用大驼峰法,和golang一致
int Login();
int Logout();
protected:
// protected,private函数使用小驼峰法
int encrypt();
int decrypt();
public:
static bool s_bInit; // 静态变量加s_前缀
string _username; // public变量加_前缀,以和局部变量区分
protected:
string password_; // protected,private变量加_后缀
Button btnLogin; // 强调类型可以使用匈牙利命名法
};
} // namespace ns
#endif // PROJECT_PATH_FILE_H
if (expr) {
...
} else {
...
}
switch (var) {
case C1: {
}
break;
case C2: {
}
break;
default: {
}
break;
}
for (int i = 0; i < 10; ++i) {
...
}
x*y + x/y
- 头文件使用#define防止重复包含,而不是MSVC下的#pragam once;
- 头文件包含顺序
- 对应头文件
- c系统头文件
- c++系统头文件
- 依赖库头文件
- 本项目头文件
- 禁止使用
using namespace foo;
,而应使用using foo:bar;
; - 命名风格推荐
- 文件名用全小写下划线法;
- 宏定义、枚举值用全大写下划线法;
- 变量名用全小写下划线法;
- 类名、枚举名、类成员函数用驼峰法,采用golang大写可见,小写不可见规则;
- 全局变量加
g_
前缀,静态变量加s_
前缀,成员变量public加_
前缀,protected、private加_
后缀; - 强调类型可适当使用匈牙利命名法;
- 类
- 纯数据成员使用struct,有函数成员的使用class;
- 构造和析构函数中禁止使用虚函数;
- 构造和析构函数中有错误返回的应额外定义Init和Deinit函数;
- 只使用public继承,其它考虑组合;
- 纯虚函数接口类习惯以Interface为后缀;
- 尽量减少继承层数;
- 尽量避免多重继承;
- 函数
- 参数传递方式:原生入参传值,对象入参传const引用,出参传指针;形如
RetType func(int n, const T& in, T* out);
- 总是做入参检查;
- 函数体不宜过大;
- 习惯返回0表示成功,其他错误码;
- 参数传递方式:原生入参传值,对象入参传const引用,出参传指针;形如
- 合理使用空格和空行;
- 用空格代替tab,习惯使用4空格缩进;
- 习惯使用const
- 零值:整型用0,浮点型用0.0,字符用’\0’,指针用NULL或者nullptr(c++11)
- 尽量延迟声明变量,减小作用域,并且总是初始化;
- 循环语句中的对象应在循环体外声明,以减少构造和析构造成的性能损失;
- 禁止使用异常和友元语法;
- 鼓励使用智能指针,以减少内存管理负担;
- 前置自增,自减操作符效率更高;
- 使用原生类型,而非WORD,DWORD之类;