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之類;