前?:
本?翻譯?C++ Programming Style Guidelines原?地址
參考資料:Google機翻
本?僅供參考痴晦,如有錯誤希望指出肛根。如有侵權摔认,會?即刪除顽照,決不?于商業(yè)?途。
本?為ID: 萌??道 http://maimieng.com/ 翻譯辽装,授權?易云課堂C++程序設計??(上)的崔毅東?師作
為課件使?帮碰,?家可以免費下載,禁??于商業(yè)?途拾积,如需轉載殉挽,需聯(lián)系本?并保留此版權聲明。(CC
版權聲明在?末)
祝?家學有所成拓巧!
——by 萌??道
1 介紹
這份?檔列出了C++開發(fā)社區(qū)中C++代碼編寫的基本指南斯碌。
這些建議是基于多個來源,個?經(jīng)驗肛度,實際需求及?些給定的建議[1]-[4]收集來的?確定的標準傻唾。
引??份新的指南?不只是引?以上的資料原因有很多。最主要是因為那些資料范圍太過寬泛承耿,并且更多的
具體規(guī)則(尤其是命名規(guī)范)需要建?策吠。同時,這份指南擁有注釋瘩绒,可以讓它??多數(shù)現(xiàn)存指南更簡單地使
?于檢查項?中的代碼。此外带族,編程指導通常以莫名其妙的?式和編程語?的技術問題混在?起锁荔。不過雖然
這份?檔不包含任何C++技術建議,但聚焦于主要的編程?格。其他可以參考C++編程實踐指南阳堕。
集成開發(fā)環(huán)境(IDE)能夠通過可視化接?跋理,?亮代碼,?動補全等提?代碼可讀性恬总。程序員應該拒絕依賴
這些特性前普。源代碼應該被我們更多地注意?不是IDE對于代碼的照顧,并且應當使代碼獨?于任何IDE但獲得
最?化的可讀性壹堰。
1.1 指南布局
這些指南以不同主題分組拭卿,并且每個建議都被標明序號,在審查代碼時可以更?便地參考贱纠。 (譯者注:最后
?條是第94峻厚,不過在這其中有?條并不存在,源?站也沒有谆焊。)
以下是指南的布局:
n. 指南簡述 |
---|
恰當?shù)睦?(以下此處不譯) |
原因, 來源 和 附加信息惠桃。 |
第三?很重要。代碼標準和指南有可能引發(fā)爭論辖试,因此為它們標注來源是很重要的辜王。
1.2 指南的重要性
在指南部分?,“必須”罐孝,“推薦”呐馆,“建議”均有特殊含義∩龅担“必須”是?定要遵守的摹恰,“推薦”是強烈建議,“建議”是
?般指引怒见。(譯者注:為了標明此俗慈,有些語?進?了重組。)
2 通?指南
- 任何違反此指南但提?代碼可讀性都是允許的遣耍。
該指南的主要?的是提?代碼可讀性闺阱,從?使得?般數(shù)量級的代碼更好的理解和維護。此指南不可能涵
蓋所有的特殊情況舵变,這需要程序員的隨機應變酣溃、靈活運?。 - 如果您和它持強烈不同的意?纪隙,您完全不必遵守此指南赊豌。
制作這份指南,并不是??個特定的代碼?格去強加于每個?绵咱。有經(jīng)驗的程序員雖然通常采?類似這種
規(guī)范碘饼,但有?份這樣的指南,且讓每個?都去熟悉它,通嘲眨可以使?們開始思考代碼?格并評判在這個
領域他們??的習慣住涉。
另???,沒有經(jīng)驗的程序員或者編程新?想要進?這??當钠绍,通常遵循?個代碼?格指南會讓這段路
途?得更加愜意舆声。
3 命名規(guī)范
3.1 ?般命名規(guī)定 - 變量和常量類型的命名每個單詞的?字?必須?寫。
Line, SavingsAccount
C++開發(fā)社區(qū)慣例柳爽。 - 變量的命名?字?必須?寫(其他單詞?字??寫)媳握。
line, savingsAccount
C++開發(fā)社區(qū)慣例。使得變量便于區(qū)別于類型泻拦,并且有效地解決了命名沖突毙芜,類似:Line line;。 - 常量的命名(包括枚舉值)必須?下劃線分隔單詞并全部?寫争拐。
MAXITERATIONS, COLORRED, PI
C++開發(fā)社區(qū)慣例腋粥。通常,常量應盡量避免使?架曹。?多數(shù)情況下隘冲,作為函數(shù)執(zhí)?所得值是更好的選擇:
int getMaxIterations() // NOT: MAX_ITERATIONS = 25
{
return 25;
}
這種形式既能增加代碼可讀性,?能確保了對于類的值具有統(tǒng)?的接?绑雄。 - 函數(shù)或?法的命名必須是動詞詞組且?字??寫(其他單詞?字??寫)展辞。
getName(), computeTotalWidth()
C++開發(fā)社區(qū)慣例。此命名規(guī)范類似于變量的命名万牺,但C++函數(shù)通過不同形式區(qū)別于變量名罗珍。 - 命名空間推薦以全部?寫命名。
model::analyzer, io::iomanager, common::math::geometry
C++開發(fā)社區(qū)慣例脚粟。 - 命名模版類型推薦使?單?的?寫字?覆旱。
template ...
template ...
C++開發(fā)社區(qū)慣例。這使得模版名稱突出于所有其他名稱核无。 - 作為名稱使?時扣唱,縮略詞不得使?全部?寫[4]。
exportHtmlSource(); // NOT: exportHTMLSource();
openDvdPlayer(); // NOT: openDVDPlayer();
使?全部?寫命名基本名稱將會和上述的命名規(guī)范沖突团南。像dVD噪沙,hTML等如此命名的變量可讀性顯然不
?。另外還有?個問題在上述例?中已經(jīng)說明吐根;當名稱和另外?個有聯(lián)系正歼,代碼可讀性會嚴重下降;縮
略詞并不那么像它本?那樣獨特拷橘。 - 全局變量推薦使?::操作符朋腋。
::mainWindow.open(), ::applicationContext.getName()
通常齐疙,應避免使?全局變量⌒裱剩可以考慮使?單件模式對象來代替。 - 類的私有變量命名推薦以下劃線為結尾赌厅。
class SomeClass {
private:
int length_ ;
}
除了變量的名稱和類型穷绵,作?域是其最重要的特性。使?下劃線指?類的作?域可以很簡單的區(qū)分局部
變量和類的成員變量特愿。這點很重要仲墨,因為類的成員變量?函數(shù)變量具有更?的作?域,因此更值得被程
序員注意揍障。此?法的另?個作?就是它很好的解決了為了給函數(shù)或構造器設值尋找合理的變量名:
void setDepth (int depth)
{
depth_ = depth;
}
有?個問題就是使?前綴還是后綴下劃線目养。兩者都被?泛的使?,但是更加建議使?后綴毒嫡,因為這樣可
以維持更好的可讀性癌蚁。
需要注意的是,變量作?域的爭議問題已經(jīng)持續(xù)很久了兜畸,雖然好像現(xiàn)在這個指南已經(jīng)獲得了贊同努释,并且
這將作為?條慣例在專業(yè)的開發(fā)者社區(qū)變得越來越普遍。 - 通?的變量推薦和其類型?致咬摇。
void setTopic(Topic* topic) // NOT: void setTopic(Topic* value)
// NOT: void setTopic(Topic* aTopic)
// NOT: void setTopic(Topic* t)
void connect(Database* database) // NOT: void connect(Database* db)
// NOT: void connect (Database* oracleDB)
通過減少術語和名稱來減少代碼復雜程度伐蒂。此外,使得僅給出名字推斷出類型變得容易肛鹏。如果有?些原
因似乎不能強烈地指出其類型名逸邦,就說明這是?種錯誤的選擇。?通?的變量有?個特殊的??在扰。這些
變量可以經(jīng)常結合類型命名:
Point startingPoint, centerPoint;
Name loginName; - 所有名稱推薦使?英?缕减。
fileName; // NOT: filNavn
在國際化開發(fā)中,英?是?選語?健田。 - 變量作?域越?烛卧,推薦使?更?的名稱,作?域越短妓局,建議使?較短的名稱[1]总放。
暫時存儲或索引的臨時變量名字最好較短。程序員閱讀這些變量應該能推斷出它的值不會在??代碼之
外使?好爬。常?的整型臨時變量有:i, j, k, m, n局雄,字符型:c, d。 - 對象的名字是暗?的且要避免出現(xiàn)在函數(shù)名稱中存炮。
line.getLength(); // NOT: line.getLineLength();
后者在類的聲明中看起來很?然炬搭,但被在例?中被證明在使?中這是多余的蜈漓。
3.2 特定命名規(guī)定 - 術語get/set必須使?在直接存取屬性的地?。
employee.getName();
employee.setName(name);
matrix.getElement(2, 4);
matrix.setElement(2, 4, value);
C++開發(fā)社區(qū)慣例宫盔。在Java語?中融虽,這個規(guī)定?乎已成為?種標準。 - 術語compute建議使?在需要計算的?法(函數(shù))中灼芭。
valueSet->computeAverage();
matrix->computeInverse()
給閱讀代碼者直接線索有额,這可能會是?個潛在的超時操作,若重復使?時彼绷,可能要考慮緩存的結果巍佑。?
致的使?此規(guī)范可以增加代碼可讀性。 - 術語find建議使?在需要查找的?法(函數(shù))中寄悯。
vertex.findNearestVertex();
matrix.findMinElement();
給閱讀代碼者直接線索萤衰,這會是?個查找的?法(函數(shù)),只涉及簡單的操作猜旬。?致的使?此規(guī)范可以
增加代碼可讀性脆栋。 - 術語initialize建議使?在建?對象或概念。
printer.initializeFontSet();
美式initialize優(yōu)于英式initialise昔馋。最好避免使?縮略詞init筹吐。 - 代表GUI(圖形化)組件的變量推薦使?組件類型作為后綴。
mainWindow, propertiesDialog, widthScale, loginText,leftScrollbar, mainForm, fileMenu, minLabel,
exitButton, yesToggle etc.
從名稱給出變量類型和對象資源的線索秘遏,可以提?代碼可讀性丘薛。 - 復數(shù)形式在表?對象集合時推薦使?。
vector points;
int values[];
從名稱給出變量類型和其中元素要進?的操作的線索邦危,可以提?代碼可讀性洋侨。 - 若存在多個對象推薦加上前綴n。
nPoints, nLines
這種標號?式來?于數(shù)學倦蚪,是?種已建?為標明多個對象的慣例希坚。 - 獨?的(實體)序號推薦加上后綴No。
tableNo, employeeNo
這種標號?式來?于數(shù)學陵且,?種已建?為標明獨?的(實體)序號的慣例裁僧。
?種更為優(yōu)雅的?式是使?前綴i:iTable, iEmployee. 這可以有效的命名迭代程序。 - 迭代程序(器)推薦命名為i慕购,j聊疲,k等。
for (int i = 0; i < nTables); i++) {
:
}
for (vector::iterator i = list.begin(); i != list.end(); i++) {
Element element = *i;
...
}
這種標號?式來?于數(shù)學沪悲,?種已建?為標明迭代程序(器)的慣例获洲。
變量名j,k等殿如,推薦只在嵌套的循環(huán)中使?贡珊。 - 布爾變量和?法(函數(shù))推薦加上前綴is最爬。
isSet, isVisible, isFinished, isFound, isOpen
C++開發(fā)社區(qū)和Java部分強制慣例。
使?后綴解決了?個常?的問題门岔,即選擇不好的布爾變量名稱爱致,類似:status,flag寒随。?isStatus或isFlag
?不太合適蒜鸡,因此程序員將被迫選擇更多有含義的名字。
這?有?些在某些條件下更好的前綴?案供選擇牢裳,他們是has,can和should前綴:
bool hasLicense();
bool canEvaluate();
bool shouldSort(); - 互補的名稱必須?在互補的操作[1]叶沛。
get/set, add/remove, create/destroy, start/stop, insert/delete,
increment/decrement, old/new, begin/end, first/last, up/down, min/max,
next/previous, old/new, open/close, show/hide, suspend/resume, etc.
通過對稱性減少代碼復雜程度 - 名稱中最好避免出現(xiàn)縮略詞蒲讯。
computeAverage(); // NOT: compAvg();
有兩種類型的單詞需要注意。第?種是詞典中列出的普通詞灰署,這些不得簡寫判帮,千萬不要這樣寫:
cmd 代替 command
cp 代替 copy
pt 代替 point
comp 代替 compute
init 代替 initialize
等
另?種是具有特殊含義的詞組,通過他們的縮略詞可以更?然的為?們所知溉箕,這些詞組要保持縮略形
式晦墙,千萬不要這樣寫:
HypertextMarkupLanguage 代替 html
CentralProcessingUnit 代替 cpu
PriceEarningRatio 代替 pe
等 - 最好避免特殊地命名指針。
Line* line; // NOT: Line* pLine;
// NOT: LIne* linePtr;
C/C++環(huán)境有許多指針類型的變量肴茄,所以很多規(guī)定?乎?法遵守晌畅。此外,程序員應當忽略C++的對象通
常斜體的特殊慣例寡痰。只有當對象的實際類型具有特殊意義抗楔,名稱才應強調類型。 - 最好避免出現(xiàn)否定的布爾變量名拦坠。
bool isError; // NOT: isNoError
bool isFound; // NOT: isNotFound
當?個名稱出現(xiàn)雙重否定時连躏,會出現(xiàn)問題。因為不能從!isNotFound直接看出其含義贞滨。 - 枚舉常量建議以共同的類型名作為前綴入热。
enum Color {
COLOR_RED,
COLOR_GREEN,
COLOR_BLUE
};
在聲明處給出額外的信息,可以看出哪些常量是共通的晓铆,以及這些常量所代表的意義勺良。?種代替?案是
總是通過共同的類型名聯(lián)系這些常量:Color::RED, Airline::AIR_FRANCE等。
注意尤蒿,枚舉名應當是典型的單數(shù)Color {...}郑气。?個復數(shù)的名稱像Colors {...},在聲明時并沒有什么區(qū)別腰池,
但這樣的?法看起來?較笨拙尾组。 - 例外的類推薦加上后綴Exception忙芒。
class AccessException
{
:
}
例外的類其實不是程序主要設計的?部分,通過命名讓它們相對于其他類更加突出讳侨。 - 函數(shù)(具有返回值的?法)推薦命名為它們執(zhí)?后的返回或者規(guī)程(void型?法)呵萨。
增加代碼可讀性。使得可以很清晰的看出其功能跨跨,尤其是其不?持什么功能潮峦。這將再?次使代碼簡化避
免副作?的產(chǎn)?。
4 ?件
4.1 源?件 - C++頭?件推薦以.h(推薦)或.hpp作為擴展名勇婴。源?件應該為.c++(推薦)忱嘹,.c,.cc或.cpp耕渴。
MyClass.c++, MyClass.h
以上均為C++標準?持的?件后綴名拘悦。 - 類推薦在頭?件中聲明,并在類名和?件名匹配的源?件中定義橱脸。
MyClass.h, MyClass.c++
易于找到給定類的相關?件础米。?個明顯的例外,即模版類聲明和定義必須在同?個.h?件內添诉。 - 推薦把所有的定義包含在源?件中屁桑。
class MyClass
{
public:
int getValue () {return value_ ;} // NO!
...
private:
int value_;
}
頭?件應當聲明?個接?,源?件應執(zhí)?它栏赴。當尋找,執(zhí)?時蘑斧,程序員應總是清楚它可以在源?件中找
到。 - ?件?錄必須在80列內艾帐。
80列是編輯器乌叶,終端,顯?端和調試器中共同的寬度柒爸,并且?件將在很多?中共享准浴,所以應當保持這些
系統(tǒng)規(guī)定參數(shù)。在程序員之間傳遞代碼時捎稚,避免?意義的斷?乐横,能夠提升代碼可讀性。 - 分?符和Tab等特殊符號必須避免在程序中出現(xiàn)今野。
這些字符?在多?編程葡公,多平臺時將必定導致編輯器,顯?端条霜,終端模擬器或者調試器出現(xiàn)問題催什。 - 分?顯?的代碼必須使其顯?易?[1]。
totalSum = a + b + c +
d + e;
function (param1, param2,
param3);
setText ("Long line split"
"into two parts.");
for (int tableNo = 0; tableNo < nTables;
tableNo += tableStep) {
...
}
當?段代碼超過80列的極限時需要分?宰睡。很難給出嚴格的規(guī)定什么情況需要分?蒲凶,但是上?的例?可以
作為參考气筋。通常:
逗號后分?
操作符后分?
對準上??的表達式的開始的新的??
4.2 包含?件和包含語句 - 頭?件必須放在?個保護裝置中。
ifndef COMCOMPANYMODULECLASSNAMEH
define COMCOMPANYMODULECLASSNAMEH
:
endif // COMCOMPANYMODULECLASSNAMEH
這個結構是為了避免產(chǎn)?編譯錯誤旋圆。
這個命名規(guī)定統(tǒng)?了源代碼中頭?件的位置宠默,避免了命名沖突。
- Include語句推薦將其按分類排級灵巧,并按等級從低到?排序搀矫。在兩個Include語句類之間空?分隔。
include
include
include
include
include "com/company/ui/PropertiesDialog.h"
include "com/company/ui/MainWindow.h"
除了展?給閱讀代碼者清晰的包含?件結構刻肄,同樣可以直接看出涉及哪些模塊瓤球。
Include?件?錄不能使?絕對路徑。編譯器指令應改為?于為包含的?件指?根?錄敏弃。
- include語句必須只放在?件頂端冰垄。
通?規(guī)范。避免隱藏(在?件內)的include語句產(chǎn)?編譯錯誤权她。
5 語句
5.1 類型 - 在?件內部使?的量的類型建議在此?件內聲明。
確保信息隱藏逝薪。 - 類的?部分必須分為公共隅要,保護和私有三部分[2][3]。所有部分必須明確董济。不合適的部分不應
混在?起步清。
順序通常為將public部分放在最上,所以當?們可以看到protected/private部分即可不再閱讀虏肾。 - 類型轉換必須明確作出廓啊。絕不能依賴隱性類型轉換。
floatValue = static_cast(intValue); // NOT: floatValue = intValue;
通過這點封豪,程序員可以意識到涉及到的不同類型谴轮,并且混合是有意的。
5.2 變量 - 變量推薦在聲明處初始化吹埠。
這確保了變量在任何時候都是有效的第步。有時不能以?個有效值初始化變量,就像:
int x, y, z;
getCenter(&x, &y, &z);
這些情況缘琅,應當保持未初始化粘都,這要好于初始化假值。 - 變量絕不能擁有雙重含義刷袍。
通過確保變量唯?地代表概念來提升代碼可讀性翩隧。減少副作?導致錯誤的機會。 - 盡量避免使?全局變量呻纹。
在C++中堆生,全局變量并不是必需的专缠。同樣適?于全局函數(shù)或者?件范圍的(靜態(tài))變量。 - 類中變量盡量不要在public中聲明顽频。
公有變量將會破環(huán)C++的信息隱藏性和封裝性藤肢。使?私有變量和訪問函數(shù)代替。這種規(guī)則的?種例外是
當類本質上是沒有?為(類似C的結構體)的?種數(shù)據(jù)結構糯景。這種情況下嘁圈,讓實例變量變公有是恰當?shù)?br> [2]。
注意:C++的結構體只是為了和C語?的?致性蟀淮,并通過減少構建結構體的數(shù)量避免增加代碼可讀性最住。使
?類來代替。 - C++的指針和引?的符號推薦靠近類型名怠惶,?不是靠近名稱涨缚。
float* x; // NOT: float *x;
int& y; // NOT: int &y ;
變量的指針或者引?屬性是類型的性質,?不是命名的策治。C語?程序員經(jīng)常在兩者中取舍脓魏,?C++中遵守
這個規(guī)則已越來越普遍。 - 隱式測試0不推薦?于布爾變量和指針通惫。
if (nLines != 0) // NOT: if (nLines)
if (value != 0.0) // NOT: if (value)
依據(jù)C++標準茂翔,沒必要定義int和float型的0和?進制0?為相同。此外履腋,使?明確的測試語句可以使被測
試的類型更清晰珊燎。建議指針同樣不應?0隱式測試也很普遍,即if (line == 0)代替if (line)遵湖。后者在
C/C++看起來很普遍也可以使?悔政。 - 推薦在盡可能?的范圍內進?變量聲明。
在?范圍保持變量的操作延旧,這樣可以更簡單的控制其作?和副作?谋国。 - for()語句內必須只能可包含循環(huán)控制語句。
sum = 0; // NOT: for (i = 0, sum = 0; i < 100; i++)
for (i = 0; i < 100; i++) sum += value[i];
sum += value[i];
增強代碼的可維護性和可讀性迁沫。使得控制體和循環(huán)包含更加清晰烹卒。 - 循環(huán)變量推薦在循環(huán)之前被初始化吉捶。
isDone = false; // NOT: bool isDone = false;
while (!isDone) { // :
: // while (!isDone) {
} // :
// } - do-while建議不使?薯鳍。
do-while循環(huán)?普通的while循環(huán)可讀性差免猾,因為其循環(huán)控制條件在底部乖寒。閱讀代碼者必須完全看完循
環(huán)才能明確循環(huán)的范圍价捧。
此外惦蚊,do-while循環(huán)?必要呼猪。任何do-while循環(huán)都可以重寫為while或for循環(huán)卤档。減少這種結構的使?來
提?代碼可讀性。 - 循環(huán)體的break和continue建議避免使?谣辞。
如果這些語句相較于同樣的結構化代碼可以提?代碼可讀性迫摔,否則建議不使?。 - while(true)這種形式推薦?于?限循環(huán)中泥从。
while (true) {
:
}
for (;;) { // NO!
:
}
while (1) { // NO!
:
}
依靠對于1進?的測試既沒有必要也沒有意義句占。for (;;)可讀性極差,并且表?上看不出它實際是個?限循
環(huán)躯嫉。
5.4 條件語句 - 復雜的條件表達式必須避免纱烘。引?臨時布爾變量代替[1]。
bool isFinished = (elementNo < 0)
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished
:
}
// NOT:
if ((elementNo < 0)
elementNo == lastElement) {
:
}
通過給表達式分配布爾變量祈餐,程序可以?動記錄(分析)擂啥。這樣的結構造可以更簡單的閱讀,改正和維
護帆阳。 - if語句中哺壶,象征性的部分推薦放在if()部分,例外放在else()部分蜒谤。
bool isOk = readFile (fileName);
if (isOk) {
:
}
else {
:
}
確保例外不會使得正常路徑難以理解山宾。這對于代碼的可讀性和性能均很重要。 - 條件語句推薦放在單獨的??鳍徽。
if (isDone) // NOT: if (isDone) doCleanup();
doCleanup();
這是為了?便調試塌碌。當寫在??中,?法清晰的知道真或假旬盯。 - 條件語句中的執(zhí)?語句必須避免。
File* fileHandle = open(fileName, "w");
if (!fileHandle) {
:
}
// NOT:
if (!(fileHandle = open(fileName, "w"))) {
:
}
條件語句中的執(zhí)?語句使得代碼難以閱讀翎猛。這需要C/C++的新程序員尤其注意胖翰。
5.5 雜項 - 代碼中推薦盡量避免幻數(shù)的使?。除了0和1切厘,其他的推薦考慮聲明常量代替萨咳。
如果?個數(shù)字??沒有?個顯?易?的含義,通過引?命名常量代替來增加代碼可讀性疫稿。另?種不同的
?法是在量被訪問處引??個?法(函數(shù))培他。 - 浮點數(shù)推薦總是帶有?數(shù)點和?少?位?數(shù)。
double total = 0.0; // NOT: double total = 0;
double speed = 3.0e8; // NOT: double speed = 3e8;
double sum;
:
sum = (a + b) * 10.0;
這強調了整型和浮點型不同的性質遗座。這兩種算數(shù)模型是完全不同且毫不相容的概念舀凛。
同樣,在上述最后?個例?中途蒋,他在某處強調了代碼中變量(sum)分配的類型猛遍,雖然這可能看起來不
太明顯。 - ?于0的浮點數(shù)推薦總是在?數(shù)點前寫上數(shù)碼0。
double total = 0.5; // NOT: double total = .5;
C++的數(shù)字和表達式系統(tǒng)借鑒于數(shù)學懊烤,并且語法應當只要允許就遵守數(shù)學慣例梯醒。同樣,0.5的可讀性明顯
?于.5腌紧;也不會使其和5混淆茸习。 - 函數(shù)必須要明確列出返回值類型。
int getValue() // NOT: getValue()
{
:
}
如果沒有明確列出壁肋,C++將會默認返回值為int型号胚。程序員不得依賴這個特點,因為這會使其他程序員覺
得這種形式難以理解墩划。 - goto語句推薦盡量避免使?涕刚。
goto語句打破了代碼的結構。只有在?常少的情況下(例如跳出?個深層的嵌套結構)goto語句建議考
慮乙帮,并且僅當替代的選擇結構被證明有較差的可讀性杜漠。 - 0推薦?來代替NULL。
NULL是標準C語?庫的部分察净,但在C++中已被淘汰驾茴。
6.1 布局 - 基本的縮進推薦為2個空格。
for (i = 0; i < nElements; i++)
a[i] = 0;
縮進1對于強調代碼的邏輯布局顯得太短氢卡。
縮進?于4使得深層的嵌套代碼很難閱讀锈至,并且增加了必須分?的可能。選擇縮進2译秦,3峡捡,4之?,2和4更
加普遍筑悴,且選擇2可以降低代碼分?的可能们拙。 - 代碼塊的布局推薦如例1(推薦)或者例2,但絕不要如例3[4]阁吝。函數(shù)和類代碼塊必須使?例2的布
局砚婆。
while (!done) {
doSomething();
done = moreToDo();
}
while (!done)
{
doSomething();
done = moreToDo();
}
while (!done)
{
doSomething();
done = moreToDo();
}
例3引??個特別的縮進,使得強調的代碼邏輯結構不如例1和例2清晰突勇。 - 類推薦使?以下格式聲明:
class SomeClass : public BaseClass
{
public:
...
protected:
...
private:
...
}
這?定程度上遵守了以上通?的代碼塊規(guī)則装盯。 - ?法(函數(shù))推薦使?以下格式定義:
void someMethod()
{
...
}
這遵守了以上通?的代碼塊規(guī)則。 - if-else語句推薦使?以下格式:
if (condition) {
statements;
}
if (condition) {
statements;
}
else {
statements;
}
if (condition) {
statements;
}
else if (condition) {
statements;
}
else {
statements;
}
這?定程度上遵守了以上通?的代碼塊規(guī)則甲馋。但是埂奈,如果?個else從句和緊鄰的if或else從句的括號在?
?也是可?的,即:
if (condition) {
statements;
} else {
statements;
}
代碼中if-else語句每個部分單獨??是更好的選擇定躏。這將使得語句控制變得更加簡單挥转,例如當需要移動
else部分時海蔽。 - for語句推薦使?以下格式:
for (initialization; condition; update) {
statements;
}
這遵守了以上通?的代碼塊規(guī)則。 - 空的for語句推薦使?以下格式:
for (initialization; condition; update)
;
這強調了for語句是空的绑谣,并且由于這是故意的所以使得代碼閱讀者清楚党窜。不過,空循環(huán)應當避免借宵。 - while語句推薦使?以下格式:
while (condition) {
statements;
}
這遵守了以上通?的代碼塊規(guī)則幌衣。 - do-while語句推薦使?以下格式:
do {
statements;
} while (condition);
這遵守了以上通?的代碼塊規(guī)則。 - switch語句推薦使?以下格式:
switch (condition) {
case ABC :
statements;
// Fallthrough
case DEF :
statements;
break;
case XYZ :
statements;
break;
default :
statements;
break;
}
注意整個switch語句中每個case關鍵字相對縮進壤玫。這使得整個switch語句清晰突出豁护。此外注意“:”前的額
外的空格。當case語句不包含break語句應當有明確的貫穿注釋欲间。省略break是個普通錯誤楚里,如果故意省
略必須要讓代碼清晰。 - try-catch語句推薦使?以下格式:
try {
statements;
}
catch (Exception& exception) {
statements;
}
這?定程度上遵守了以上通?的代碼塊規(guī)則猎贴。if-else語句關于?括號的規(guī)則通樣可以運?于try-catch語
句班缎。 - 單獨的if-else,for她渴,或while語句建議不加?括號达址。
if (condition)
statement;
while (condition)
statement;
for (initialization; condition; update)
statement;
通常推薦應當是在任何情況?括號都不應缺少。但是趁耗,通常語?構造中?括號是?來歸納多條語句沉唠。單
條語句使??括號會顯得多余。不過苛败,有?種反對此語法的聲?满葛,如果增加語句?忘記加?括號,代碼
就會出錯罢屈。但不論怎樣嘀韧,代碼絕不應當為了適應可能發(fā)?的改變。 - 函數(shù)的返回值類型建議放在函數(shù)名上?左對?儡遮。
void
MyClass::myMethod(void)
{
:
}
這使得更容易發(fā)現(xiàn)函數(shù)名,因為它們都在第?列開始暗赶。
6.2 空?
-常規(guī)操作符推薦在前后加空格以間隔鄙币。
-C++保留字后推薦加空格以間隔。
-逗號后推薦加空格以間隔蹂随。
-冒號推薦在前后加空格以間隔
-for循環(huán)語句內的分號后推薦加空格以間隔十嘿。
a = (b + c) * d; // NOT: a=(b+c)*d
while (true) // NOT: while(true)
{
...
doSomething(a, b, c, d); // NOT: doSomething(a,b,c,d);
case 100 : // NOT: case 100:
for (i = 0; i < 10; i++) { // NOT: for(i=0;i<10;i++){
...
讓語句的每?部分都獨?出來。增加代碼可讀性岳锁。在C++代碼中绩衷,很難給出?個完整的空格使?建議列
表。以上的例?只是給出?個通常的建議。
- ?法(函數(shù))名后若相連其他名稱咳燕,建議以空格隔開勿决。
doSomething (currentFile);
讓每個名稱獨?出來。增加代碼可讀性招盲。當后?沒有名稱低缩,空格可以省略(doSomething()),這種情況名
稱就不?獨?曹货。左圓括號后是否加空格這個規(guī)范并沒有要求咆繁,即都是可以的。這個規(guī)范通常在右括號前
留?個空格: doSomething( currentFile ); 這樣做使得每個名稱作為不同含義?獨?顶籽,但是右括號前的
空格更像是?種藝術玩般,并且沒有那個空格的語句會顯得不對稱(doSomething( currentFile);)。 - 邏輯集合代碼塊推薦以空?分隔礼饱。
Matrix4x4 matrix = new Matrix4x4();
double cosAngle = Math.cos(angle);
double sinAngle = Math.sin(angle);
matrix.setElement(1, 1, cosAngle);
matrix.setElement(1, 2, sinAngle);
matrix.setElement(2, 1, -sinAngle);
matrix.setElement(2, 2, cosAngle);
multiply(matrix);
通過在不同的邏輯集合代碼塊加?空?增加代碼可讀性坏为。 - ?法(函數(shù))推薦以三個空?分隔。
通過?空?使得?法(函數(shù))在類中獨?慨仿。 - 變量聲明建議左對?久脯。
AsciiFile* file;
int nPoints;
float x, y;
增加代碼可讀性。變量可以通過對?簡單的分別類型镰吆。 - 當使?對?可以增加代碼可讀性就使?對?帘撰。
if (a == lowValue) compueSomething();
else if (a == mediumValue) computeSomethingElse();
else if (a == highValue) computeSomethingElseYet();
value = (potential * oilDensity) / constant1 +
(depth * waterDensity) / constant2 +
(zCoordinateValue * gasDensity) / constant3;
minPosition = computeDistance(min, x, y, z);
averagePosition = computeDistance(average, x, y, z);
switch (value) {
case PHASE_OIL : strcpy(phase, "Oil"); break;
case PHASE_WATER : strcpy(phase, "Water"); break;
case PHASE_GAS : strcpy(phase, "Gas"); break;
}
盡管這點違反了普遍的規(guī)范,但是代碼中很多地?需要如此來增加代碼可讀性就是允許的万皿。上述很多情
況下不得不要將代碼對?摧找。代碼對?的通?規(guī)范很難給出,但是以上的例?就是很通?的線索牢硅。
6.3 注釋 - ?厘頭的代碼不需要注釋蹬耘,需要重寫![1]减余。
通常综苔,注釋應當通過代碼命名的選擇和明確的邏輯結構提升???檔化?盡量減少使?。 - 所有注釋推薦使?英?書寫[2]位岔。
在國際化開發(fā)環(huán)境中如筛,英?是?選語?。 - 所有注釋均?//抒抬,包括多?注釋杨刨。
// Comment spanning
// more than one line.
?從多級C注釋不被?持,使?//注釋確保注釋所有?件部分總是可能的擦剑。調試等?的時使?/**/妖胀。
推薦真正注釋和//之間保留?個空格芥颈,并且注釋應當以?個?寫字?開頭,以句號結束赚抡。 - 推薦將注釋和代碼同等位置(縮進)爬坑。
while (true) { // NOT: while (true) {
// Do something // Do something
something(); something();
} }
這是為了避免注釋打破程序的邏輯結構。 - 類和?法的初始注釋推薦依照javaDoc規(guī)定怕品。
作為標準的類和?法?檔妇垢,Java開發(fā)社區(qū)?C/C++開發(fā)社區(qū)要更加成熟。這是因為標準?動化Javadoc
?具是開發(fā)套件的?部分肉康,并且它?這些注釋幫助做出?質量超?本?檔闯估。類Javadoc?具同樣可?于
C++。這些相同的標簽語法類似于Javadoc吼和≌切剑看這?的Doc++或Doxygen實例。
7 引?(以下不再翻譯) [1] Code Complete, Steve McConnell - Microsoft Press
[2] Programming in C++, Rules and Recommendations, M Henricson, e. Nyquist, Ellemtel (Swedish
telecom) http://www.doc.ic.ac.uk/lab/cplus/c%2b%2b.rules/
[3] Wildfire C++ Programming Style, Keith Gabryelski, Wildfire Communications Inc.
http://www.wildfire.com/~ag/Engineering/Development/C++Style/
[4] C++ Coding Standard, Todd Hoff http://www.possibility.com/Cpp/CppCodingStandard.htm
[5] Doxygen documentation system http://www.stack.nl/~dimitri/doxygen/index.html
[Translate]C++編程代碼?格指南 由 萌??道 創(chuàng)作炫乓,采? 知識共享 署名-?商業(yè)性使?-相同?式共享 4.0 國
際 許可協(xié)議進?許可刚夺。
基于http://geosoft.no/development/cppstyle.html上的作品創(chuàng)作。
本許可協(xié)議授權之外的使?權限可以從 http://maimieng.com/ 處獲得末捣。