c++风格指南

版权声明:本文为博主原创文章,未经博主允许不得转载。 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表示成功,其他错误码;
  • 合理使用空格和空行;
  • 用空格代替tab,习惯使用4空格缩进;
  • 习惯使用const
  • 零值:整型用0,浮点型用0.0,字符用’\0’,指针用NULL或者nullptr(c++11)
  • 尽量延迟声明变量,减小作用域,并且总是初始化;
  • 循环语句中的对象应在循环体外声明,以减少构造和析构造成的性能损失;
  • 禁止使用异常和友元语法;
  • 鼓励使用智能指针,以减少内存管理负担;
  • 前置自增,自减操作符效率更高;
  • 使用原生类型,而非WORD,DWORD之类;

猜你喜欢

转载自blog.csdn.net/GG_SiMiDa/article/details/82853420