本文參考資料:
原版:http://1code.codeplex.com/releases/view/51868#DownloadId=148423
譯版:http://1codechs.codeplex.com/releases/view/51227#DownloadId=148734
原則:
(1) 團(tuán)隊(duì)風(fēng)格統(tǒng)一,明確規(guī)則,提高可讀性
1. 字符串類問(wèn)題
std::wstring
std::string
tstring(TCHAR版本的std::string)
TCHAR
char*
wchar*
char[]
wchar[]
LPCTSTR
LPTSTR
xxstring(自己封裝的string類)
其它庫(kù)的 string
""
L""
_T("")
Format() 問(wèn)題
無(wú)論采用哪種string, 是否采用UNICODE,都要規(guī)定好;
??
2. 宏命名規(guī)范1. 所有字母大寫
2. 單詞之間用_分隔
3. BOOL 還是 bool??? TRUE or true?? FALSE or true?
4.名字空間濫用?1. 一個(gè)Project只需要一個(gè)NameSpace 或 ProjectName.io.xxxxx 的形式
5. 代碼跨平臺(tái)兼容?6. API函數(shù)前面的 :: ?1. 用于區(qū)分系統(tǒng)API函數(shù)與本地函數(shù)
7. 函數(shù)命名?1. 采用 "動(dòng)"+"賓"結(jié)構(gòu),
2. Is + 動(dòng) + 賓 結(jié)構(gòu)
3. 意思明確,無(wú)歧義
8. 濫用第三方庫(kù)?9. 當(dāng) if 里只有一條語(yǔ)句時(shí)?if(xxxxxxx)
??? 語(yǔ)句;
or
if(xxxxxxx)
{
??? 語(yǔ)句;
}
10. 函數(shù)的參數(shù)安全性判斷 與 多重判斷 帶來(lái)的性能負(fù)累?
A函數(shù)與B函數(shù)有著一樣的參數(shù)
A函數(shù)調(diào)用B函數(shù)
結(jié)果 A函數(shù)對(duì)所有參數(shù)進(jìn)行了安全性的判斷
A函數(shù)調(diào)用B函數(shù)時(shí),又重復(fù)作了安全性的判斷
11. 注釋規(guī)范?
1. 文件頭注釋?
2. 函數(shù)注釋?
3. 函數(shù)內(nèi)注釋?
12. 所有返回值都需要處理,即使你不想理它,也要給它加上 UNREFERENCED_PARAMETER 宏
#define UNREFERENCED_PARAMETER(P) (P)
13. 每個(gè)函數(shù)都會(huì)有執(zhí)行失敗的時(shí)候(雖然它可能失敗的機(jī)率是萬(wàn)分之一),
但也請(qǐng)小心處理它14. 關(guān)于其它命名空間里函數(shù)的用法?#include <vector>
using namespace std;
vector<int> vecTest;
or
#include <vector>
std::vector<int> vecTest;
1. 不要在頭文件中直接使用 using,特別是 using namespace , 這樣別人在引用這個(gè)頭文件時(shí),會(huì)出現(xiàn)“名字污染”,可能涉及整個(gè)工程
2. 如果非要使用 using ,在名字空間中使用,這樣不用影響到整個(gè)工程15. 類與類之間的依賴?如:
ProjectName::io::CDir? 依賴于? ProjectName::io::CFile
ProjectName::io::CFile 依賴于? ProjectName::util::CString
同個(gè)項(xiàng)目中,類與類之間的依賴是可以理解的,但當(dāng)某天我想用這個(gè)Project中的某個(gè)類時(shí),依賴的文件太多,不容易單獨(dú)抽出來(lái)使用
16. C++代碼中是否應(yīng)該使用 goto?
17. 模板中的 typename or class?
統(tǒng)一采用 typename
18. delete or delete[] ?
如: char* p = new char[255];
??? delete p;
還是
??? char* p = new char[255];
??? delete[] p;
??? ?
19. stringstream or sprintf ?
20. 0 或 NULL?
21. CTime or time_t?
22. UINT32 or unsigned int?
23. 設(shè)計(jì)模式的濫用?
為了防止設(shè)計(jì)模式的濫用,未清楚設(shè)計(jì)模式的意圖前,別用它
24. 所有的變量都必須賦予初始值。
25. 關(guān)于注釋,注釋形式不限,但
?? (1)每個(gè)函數(shù)至少要有簡(jiǎn)要的注釋;
?? (2)每個(gè)參數(shù)都要說(shuō)明其用途
26. int* pValue or int *pValue ?
27. if( NULL != p??) or if ( p != NULL??) ?
28. x, y, or width, height?
29. x = (xxx*)y;? or x = dynamic_cast<xxx*>(y) ?
--- 使用后者,因?yàn)楹笳邥?huì)進(jìn)行類型判斷,如果不一致會(huì)拋出異常
vc6.0要支持向下轉(zhuǎn)型要加入GR開關(guān),而這在vc6.0z中是默認(rèn)關(guān)閉的
30. 采用最直觀的方式寫代碼
31. 語(yǔ)句太長(zhǎng)?
寫法1:
00235???? const char *opname =
00236???????? (op==PJ_ICE_STRANS_OP_INIT? "initialization" :
00237???????????? (op==PJ_ICE_STRANS_OP_NEGOTIATION ? "negotiation" : "unknown_op"));
寫法2:
00297???????? CHECK( pj_dns_resolver_create(&icedemo.cp.factory,
00298????????????????????????????????????????????????????????????? "resolver",
00299????????????????????????????????????????????????????????????? 0,
00300????????????????????????????????????????????????????????????? icedemo.ice_cfg.stun_cfg.timer_heap,
00301???????????????????????????????????????????????????????????? ?icedemo.ice_cfg.stun_cfg.ioqueue,
00302???????????????????????????????????????????????????????????? &icedemo.ice_cfg.resolver) );
寫法3:
00397????
00398???? status = pj_ice_strans_create("icedemo",????????????????????
00399????????????????????????????????????????????????? &icedemo.ice_cfg,????????
00400????????????????????????????????????????????????? icedemo.opt.comp_cnt,?
00401????????????????????????????????????????????????? NULL,?????????????????????????
00402????????????????????????????????????????????????? &icecb,????????????????????????
00403???????????????????????????????????????????????? &icedemo.icest)????????????
00404???????????????????????????????????????????????? ;
寫法4:
00442???? pj_ice_sess_role role = (pj_tolower((pj_uint8_t)rolechar)=='o' ?
00443???????????????????????????????????????????????? ?PJ_ICE_SESS_ROLE_CONTROLLING :
00444????????????????????????????????????????????????? PJ_ICE_SESS_ROLE_CONTROLLED);
寫法5:
00493
#define PRINT(fmt, arg0, arg1, arg2, arg3, arg4, arg5)????? \00494
??????????? printed = pj_ansi_snprintf(p, maxlen - (p-buffer),? \00495?
????????????fmt, arg0, arg1, arg2, arg3, arg4, arg5); \00496
??????????? if (printed <= 0) return -PJ_ETOOSMALL; \00497
??????????? p += printed
32. 當(dāng) if 語(yǔ)句的只有一條語(yǔ)句時(shí),哪種寫法更好?
(1)? if(xxxx)
????? {
???????????? xxxxx;
????? }
(2) if(xxxx)
??????????? xxxxxx;
-----------------------------------------------------------------------------
1. 概覽1.1. 原則和主旨高質(zhì)量代碼有如下特質(zhì):
(1) 可讀性,簡(jiǎn)單明確, 注釋清楚,突出重點(diǎn), 示例代碼
(2) 一致性, 代碼風(fēng)格統(tǒng)一
(3) 正確性, 經(jīng)過(guò)單元測(cè)試,pc-lint檢測(cè), 符合文檔描術(shù)要求
(4) 安全性
2.1. 類名以C開頭
?? (1)普通類采用 Cxxx 形式?
????? 例: CSimple
?? (2)模板類采用 CxxxT 形式?
????? 例: CSmartPointorT
2.2. 接口類使用I開頭??? (1)接口類指純虛類
??? (2)采用 Ixxx 形式
????? 例: ILoggable
2.3. 枚舉類型命名??? (1)所有字母大寫
??? (2)以 ENUM_ 開頭
??? (3)每個(gè)單詞之間盡量用_分隔
??? (4)具體的值不需要 ENUM_ 開頭
??? 例:enum ENUM_DWMNCRENDERINGPOLICY
??????? {
??????????? DWMNCRP_USE_WINDOWS_TYLE,
??????????? DWMNCRP_DISABLED,
??????????? DWMNCRP_ENABLED,
??????????? DWMNCRP_LAST
??????? };
2.4. 函數(shù)指針類型命名??? (1)所有字母大寫
??? (2)采用 FN_函數(shù)名_TYPE 的形式
?? 例:
typedef HRESULT (WINAPI *FN_DWMSETWINDOWATTRIBUTE_TYPE)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
2.5. 函數(shù)指針命名??? (1) 采用 pfn函數(shù)名 的形式
??? 例:FN_DWMSETWINDOWATTRIBUTE_TYPE pfnDwmSetWindowAttribute = NULL;
名字縮寫規(guī)范:Manager = Mgr
Message = Msg
asynchronous = asyn
event = evt
object = obj
volume = vol
project = prj
calculate = calc