c++風格指南

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之類;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章