c++代碼規範(個人)

c++開發規範

1 命名規範

1-1 類型命名

[Standards] 遵照 帕斯卡(pascal) 命名法

(1) class

/* 抽象類,'A'打頭,如:ASharedPtr,
 * 注:由於class放在命名空間中,所以類名稱中不需要再追加項目名和模塊名前綴
 * 如:class AAlgorithm;
 */
class AXxxYyy;

/** 接口類,'I'打頭,如:ISharedPtr 
 * 如:class IAlgorithm;
 */
class IXxxYyy;

/** 普通類,'C'打頭,如:CSharedPtr,名字中有縮寫時,如"CSV",將之看做一個詞彙首字母大寫即"Csv",
 * 如:class CCsvReader;
 */
class CXxxYyy;

(2) struct/union/enum

[Standards] POD對象遵循全大寫命名,並使用typedef tag…重命名,是爲了方便調試

/** 僅內部使用的POD對象
 * 如:
 * struct FOO_TYPE {}; 
 */
typedef struct tagXXX_YYY {
} XXX_YYY, *LPXXX_YYY;

[Standards] 僅內部使用POD,不允許匿名內嵌POD對象,嵌套POD對象使用"INNER"前綴,如:

typedef struct tagXXX_YYY {
    struct INNER_ZZZ_KKK{};
} XXX_YYY, *LPXXX_YYY;

[Standards] 外部使用POD對象,需要加上項目名,追加模塊名;且不允許內嵌POD對象,如:

/**
 * 如:PUMP-項目名,MEM-模塊名
 * typedef struct tagPUMP_MEM_POD_TYPE {
 * } PUMP_MEM_POD_TYPE,*LPPUMP_MEM_POD_TYPE;
 */
typedef struct tagXXX_YYY_ZZZ_KKK {
} XXX_YYY_ZZZ_KKK, *LPXXX_YYY_ZZZ_KKK;

1-2 變量命名

[Standards] 普通變量名,遵守 匈牙利命名法 規範,增加變量類型前綴。變量的名字應當使用“名詞”或者“形容詞+名詞”。

(1) 類型前綴

前綴 說明
ch 字符類型char
by 無符號字符unsigned char
sz char*
s 短整數類型short int
w unsigned short (WORD)
n 整數類型int
dw unsigned int (DWORD)
l 長整數類型long int
ul unsigned long
ll long long
ull unsigned long long
b 布爾型變量bool
f 單浮點型變量float
d 雙浮點型變量double
ld 長雙浮點型變量long double
obj class實例
stru struct實例
un union實例
em enum實例
h 句柄,文件描述符
pfn 函數指針
str 字符串string
vec std::vector
set std::set
lst std::list
map std::map
stak std::stack
it 迭代器
arr array, 如:int arrNum[10]
p 指針變量,如:void * pData; int * pNum;
pp 二重指針
k 全局/靜態常量,如:const char* kDeviceId = “NVR-DS-0294jk928”;

(2) 作用域前綴

前綴 說明
g_ 全局變量 (注:google規範不建議使用非POD對象作爲全局棧上對象)
m_ 成員變量
s_ 局部靜態變量, static
sg_ 靜態全局變量
sm_ 靜態成員變量
gg_ 進程共享

(3) 複合類型成員變量命名

[Standards] class 對象成員變量,必須以"m_"作爲前綴,類靜態成員則"sm_"前綴打頭,變量名稱須複合匈牙利命名法

class CTestType
{
private:
    int m_nNum;
    DeviceInfo m_objDevInfo;
    const char* m_szIp;
};

[Standards] struct/union 對象成員以"_"爲後綴,變量名稱須複合匈牙利命名法

typedef struct tagDEVICE_INFO
{
    int nNum_;
    int nX_;
    char * szIp_;
} DEVICE_INFO, *LPDEVICE_INFO;

1-3 接口命名

(1) 內部接口

[Standards] 遵照 帕斯卡(pascal) 命名法,應當使用"動詞"或者"動詞+名詞"(動賓詞組)的形式, 參數最找普通變量命名即可

/**
 * 如:
 * void GetGlobalConfig(const char * szBuf, int nNum);
 */
RetType XxxYxxZzz(...);

(1) 外部接口

[Standards] 採用類似於外部POD對象的命名方式,追加全大寫項目名,模塊名前綴

/**
 * 如:
 * void PUMP_CONF_GetGlobalConfig();
 */
RetType XXX_YxxZzz(...);

(3) 類對象成員函數

[Standards]

  • 類成員函數應當只使用“動詞”或“動詞”+“名詞”,被省略掉的名詞就是對象本身。例如:“box->Draw();”。
  • 保護成員函數:開頭應當加上一個下劃線“_”以示區別,例如:"_SetState()"
  • 私有成員函數:開頭應當加上兩個下劃線“__”,例如:"__DestroyImp()"
  • 虛函數:習慣以“Do”開頭,如:“DoRefresh()”, “_DoEncryption()”
  • 回調和事件處理函數 :習慣以單詞“On”開頭。例如:"_OnTimer()", “OnExit()”
class CPerson
{
public:
    void SetName(const char *szName, size_t dwSize);
    void GetName(char *szName, size_t *dwSize);
protected:
    virtual void _DoEatFood(int nNum);
private:
    void __GetEmotion(int * nLevel);
    void __OnSocializing(const char* szMsg);

private:
    char m_szName[32];
};

2 註釋規範

待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章