原文地址:Google C++ Style Guide
前面說(shuō)明的編碼習(xí)慣基本是強(qiáng)制性的,但所有優(yōu)秀的規(guī)則都允許例外。
1. 現(xiàn)有不統(tǒng)一代碼(Existing Non-conformant Code)
對(duì)于現(xiàn)有不符合既定編程風(fēng)格的代碼可以網(wǎng)開一面。
當(dāng)你修改使用其他風(fēng)格的代碼時(shí),為了與代碼原有風(fēng)格保持一致可以不使用本指南約定。如果不放心可以與代碼原作者或現(xiàn)在的負(fù)責(zé)人員商討,記住,一致性包括原有的一致性。
1. Windows代碼(Windows Code)
Windows程序員有自己的編碼習(xí)慣,主要源于Windows的一些頭文件和其他Microsoft代碼。我們希望任何人都可以順利讀懂你的代碼,所以針對(duì)所有平臺(tái)的C++編碼給出一個(gè)單獨(dú)的指導(dǎo)方案。
如果你一直使用Windows編碼風(fēng)格的,這兒有必要重申一下某些你可能會(huì)忘記的指南(譯者注,我怎么感覺像在被洗腦:D):
1) 不要使用匈牙利命名法(Hungarian notation,如定義整型變量為iNum
),使用Google命名約定,包括對(duì)源文件使用.cc
擴(kuò)展名;
2) Windows定義了很多原有內(nèi)建類型的同義詞(譯者注,這一點(diǎn),我也很反感),如DWORD
、HANDLE
等等,在調(diào)用Windows API時(shí)這是完全可以接受甚至鼓勵(lì)的,但還是盡量使用原來(lái)的C++類型,例如,使用const TCHAR *
而不是LPCTSTR
;
3) 使用Microsoft Visual C++進(jìn)行編譯時(shí),將警告級(jí)別設(shè)置為3或更高,并將所有warnings當(dāng)作errors處理;
4) 不要使用#pragma once
;作為包含保護(hù),使用C++標(biāo)準(zhǔn)包含保護(hù),包含保護(hù)的文件路徑包含到項(xiàng)目樹頂層(譯者注,#include<prj_name/public/tools.h>
);
5) 除非萬(wàn)不得已,否則不使用任何不標(biāo)準(zhǔn)的擴(kuò)展,如#pragma
和__declspec
,允許使用__declspec(dllimport)
和__declspec(dllexport)
,但必須通過DLLIMPORT
和DLLEXPORT
等宏,以便其他人在共享使用這些代碼時(shí)容易放棄這些擴(kuò)展。
在Windows上,只有很少一些偶爾可以不遵守的規(guī)則:
1) 通常我們禁止使用多重繼承,但在使用COM和ATL/WTL類時(shí)可以使用多重繼承,為了執(zhí)行COM或ATL/WTL類及其接口時(shí)可以使用多重實(shí)現(xiàn)繼承;
2) 雖然代碼中不應(yīng)使用異常,但在ATL和部分STL(包括Visual C++的STL)中異常被廣泛使用,使用ATL時(shí),應(yīng)定義_ATL_NO_EXCEPTIONS
以屏蔽異常,你要研究一下是否也屏蔽掉STL的異常,如果不屏蔽,開啟編譯器異常也可以,注意這只是為了編譯STL,自己仍然不要寫含異常處理的代碼;
3) 通常每個(gè)項(xiàng)目的每個(gè)源文件中都包含一個(gè)名為StdAfx.h
或precompile.h
的頭文件方便頭文件預(yù)編譯,為了使代碼方便與其他項(xiàng)目共享,避免顯式包含此文件(precompile.cc
除外),使用編譯器選項(xiàng)/FI
以自動(dòng)包含;
4) 通常名為resource.h、且只包含宏
的資源頭文件,不必拘泥于此風(fēng)格指南。
參考常識(shí),保持一致。
編輯代碼時(shí),花點(diǎn)時(shí)間看看項(xiàng)目中的其他代碼并確定其風(fēng)格,如果其他代碼if
語(yǔ)句中使用空格,那么你也要使用。如果其中的注釋用星號(hào)(*
)圍成一個(gè)盒子狀,你也這樣做:
/**********************************
* Some comments are here.
* There may be many lines.
**********************************/
編程風(fēng)格指南的使用要點(diǎn)在于提供一個(gè)公共的編碼規(guī)范,所有人可以把精力集中在實(shí)現(xiàn)內(nèi)容而不是表現(xiàn)形式上。我們給出了全局的風(fēng)格規(guī)范,但局部的風(fēng)格也很重要,如果你在一個(gè)文件中新加的代碼和原有代碼風(fēng)格相去甚遠(yuǎn)的話,這就破壞了文件本身的整體美觀也影響閱讀,所以要盡量避免。
好了,關(guān)于編碼風(fēng)格寫的差不多了,代碼本身才是更有趣的,盡情享受吧!
Benjy Weinberger
Craig Silverstein
Gregory Eitzmann
Mark Mentovai
Tashana Landray
______________________________________
譯者:終于翻完了,前后歷時(shí)兩周,整個(gè)過程中,雖因工作關(guān)系偶有懈怠,但總算不是虎頭蛇尾(起碼我的態(tài)度是非常認(rèn)真的:D),無(wú)論是否能對(duì)你有所裨益,對(duì)我而言,至少是溫習(xí)了一些以前知道的知識(shí),也學(xué)到了一些之前不知道的知識(shí)。
剛好這兩天還不是特緊張,趕緊翻完了,要開始干活了……