C++編程風格指南-中文版

前?:
本?翻譯?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 通?指南

  1. 任何違反此指南但提?代碼可讀性都是允許的遣耍。
    該指南的主要?的是提?代碼可讀性闺阱,從?使得?般數(shù)量級的代碼更好的理解和維護。此指南不可能涵
    蓋所有的特殊情況舵变,這需要程序員的隨機應變酣溃、靈活運?。
  2. 如果您和它持強烈不同的意?纪隙,您完全不必遵守此指南赊豌。
    制作這份指南,并不是??個特定的代碼?格去強加于每個?绵咱。有經(jīng)驗的程序員雖然通常采?類似這種
    規(guī)范碘饼,但有?份這樣的指南,且讓每個?都去熟悉它,通嘲眨可以使?們開始思考代碼?格并評判在這個
    領域他們??的習慣住涉。
    另???,沒有經(jīng)驗的程序員或者編程新?想要進?這??當钠绍,通常遵循?個代碼?格指南會讓這段路
    途?得更加愜意舆声。
    3 命名規(guī)范
    3.1 ?般命名規(guī)定
  3. 變量和常量類型的命名每個單詞的?字?必須?寫。
    Line, SavingsAccount
    C++開發(fā)社區(qū)慣例柳爽。
  4. 變量的命名?字?必須?寫(其他單詞?字??寫)媳握。
    line, savingsAccount
    C++開發(fā)社區(qū)慣例。使得變量便于區(qū)別于類型泻拦,并且有效地解決了命名沖突毙芜,類似:Line line;。
  5. 常量的命名(包括枚舉值)必須?下劃線分隔單詞并全部?寫争拐。
    MAXITERATIONS, COLORRED, PI
    C++開發(fā)社區(qū)慣例腋粥。通常,常量應盡量避免使?架曹。?多數(shù)情況下隘冲,作為函數(shù)執(zhí)?所得值是更好的選擇:
    int getMaxIterations() // NOT: MAX_ITERATIONS = 25
    {
    return 25;
    }
    這種形式既能增加代碼可讀性,?能確保了對于類的值具有統(tǒng)?的接?绑雄。
  6. 函數(shù)或?法的命名必須是動詞詞組且?字??寫(其他單詞?字??寫)展辞。
    getName(), computeTotalWidth()
    C++開發(fā)社區(qū)慣例。此命名規(guī)范類似于變量的命名万牺,但C++函數(shù)通過不同形式區(qū)別于變量名罗珍。
  7. 命名空間推薦以全部?寫命名。
    model::analyzer, io::iomanager, common::math::geometry
    C++開發(fā)社區(qū)慣例脚粟。
  8. 命名模版類型推薦使?單?的?寫字?覆旱。
    template ...
    template ...
    C++開發(fā)社區(qū)慣例。這使得模版名稱突出于所有其他名稱核无。
  9. 作為名稱使?時扣唱,縮略詞不得使?全部?寫[4]。
    exportHtmlSource(); // NOT: exportHTMLSource();
    openDvdPlayer(); // NOT: openDVDPlayer();
    使?全部?寫命名基本名稱將會和上述的命名規(guī)范沖突团南。像dVD噪沙,hTML等如此命名的變量可讀性顯然不
    ?。另外還有?個問題在上述例?中已經(jīng)說明吐根;當名稱和另外?個有聯(lián)系正歼,代碼可讀性會嚴重下降;縮
    略詞并不那么像它本?那樣獨特拷橘。
  10. 全局變量推薦使?::操作符朋腋。
    ::mainWindow.open(), ::applicationContext.getName()
    通常齐疙,應避免使?全局變量⌒裱剩可以考慮使?單件模式對象來代替。
  11. 類的私有變量命名推薦以下劃線為結尾赌厅。
    class SomeClass {
    private:
    int length_ ;
    }
    除了變量的名稱和類型穷绵,作?域是其最重要的特性。使?下劃線指?類的作?域可以很簡單的區(qū)分局部
    變量和類的成員變量特愿。這點很重要仲墨,因為類的成員變量?函數(shù)變量具有更?的作?域,因此更值得被程
    序員注意揍障。此?法的另?個作?就是它很好的解決了為了給函數(shù)或構造器設值尋找合理的變量名:
    void setDepth (int depth)
    {
    depth_ = depth;
    }
    有?個問題就是使?前綴還是后綴下劃線目养。兩者都被?泛的使?,但是更加建議使?后綴毒嫡,因為這樣可
    以維持更好的可讀性癌蚁。
    需要注意的是,變量作?域的爭議問題已經(jīng)持續(xù)很久了兜畸,雖然好像現(xiàn)在這個指南已經(jīng)獲得了贊同努释,并且
    這將作為?條慣例在專業(yè)的開發(fā)者社區(qū)變得越來越普遍。
  12. 通?的變量推薦和其類型?致咬摇。
    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;
  13. 所有名稱推薦使?英?缕减。
    fileName; // NOT: filNavn
    在國際化開發(fā)中,英?是?選語?健田。
  14. 變量作?域越?烛卧,推薦使?更?的名稱,作?域越短妓局,建議使?較短的名稱[1]总放。
    暫時存儲或索引的臨時變量名字最好較短。程序員閱讀這些變量應該能推斷出它的值不會在??代碼之
    外使?好爬。常?的整型臨時變量有:i, j, k, m, n局雄,字符型:c, d。
  15. 對象的名字是暗?的且要避免出現(xiàn)在函數(shù)名稱中存炮。
    line.getLength(); // NOT: line.getLineLength();
    后者在類的聲明中看起來很?然炬搭,但被在例?中被證明在使?中這是多余的蜈漓。
    3.2 特定命名規(guī)定
  16. 術語get/set必須使?在直接存取屬性的地?。
    employee.getName();
    employee.setName(name);
    matrix.getElement(2, 4);
    matrix.setElement(2, 4, value);
    C++開發(fā)社區(qū)慣例宫盔。在Java語?中融虽,這個規(guī)定?乎已成為?種標準。
  17. 術語compute建議使?在需要計算的?法(函數(shù))中灼芭。
    valueSet->computeAverage();
    matrix->computeInverse()
    給閱讀代碼者直接線索有额,這可能會是?個潛在的超時操作,若重復使?時彼绷,可能要考慮緩存的結果巍佑。?
    致的使?此規(guī)范可以增加代碼可讀性。
  18. 術語find建議使?在需要查找的?法(函數(shù))中寄悯。
    vertex.findNearestVertex();
    matrix.findMinElement();
    給閱讀代碼者直接線索萤衰,這會是?個查找的?法(函數(shù)),只涉及簡單的操作猜旬。?致的使?此規(guī)范可以
    增加代碼可讀性脆栋。
  19. 術語initialize建議使?在建?對象或概念。
    printer.initializeFontSet();
    美式initialize優(yōu)于英式initialise昔馋。最好避免使?縮略詞init筹吐。
  20. 代表GUI(圖形化)組件的變量推薦使?組件類型作為后綴。
    mainWindow, propertiesDialog, widthScale, loginText,leftScrollbar, mainForm, fileMenu, minLabel,
    exitButton, yesToggle etc.
    從名稱給出變量類型和對象資源的線索秘遏,可以提?代碼可讀性丘薛。
  21. 復數(shù)形式在表?對象集合時推薦使?。
    vector points;
    int values[];
    從名稱給出變量類型和其中元素要進?的操作的線索邦危,可以提?代碼可讀性洋侨。
  22. 若存在多個對象推薦加上前綴n。
    nPoints, nLines
    這種標號?式來?于數(shù)學倦蚪,是?種已建?為標明多個對象的慣例希坚。
  23. 獨?的(實體)序號推薦加上后綴No。
    tableNo, employeeNo
    這種標號?式來?于數(shù)學陵且,?種已建?為標明獨?的(實體)序號的慣例裁僧。
    ?種更為優(yōu)雅的?式是使?前綴i:iTable, iEmployee. 這可以有效的命名迭代程序。
  24. 迭代程序(器)推薦命名為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)中使?贡珊。
  25. 布爾變量和?法(函數(shù))推薦加上前綴is最爬。
    isSet, isVisible, isFinished, isFound, isOpen
    C++開發(fā)社區(qū)和Java部分強制慣例。
    使?后綴解決了?個常?的問題门岔,即選擇不好的布爾變量名稱爱致,類似:status,flag寒随。?isStatus或isFlag
    ?不太合適蒜鸡,因此程序員將被迫選擇更多有含義的名字。
    這?有?些在某些條件下更好的前綴?案供選擇牢裳,他們是has,can和should前綴:
    bool hasLicense();
    bool canEvaluate();
    bool shouldSort();
  26. 互補的名稱必須?在互補的操作[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.
    通過對稱性減少代碼復雜程度
  27. 名稱中最好避免出現(xiàn)縮略詞蒲讯。
    computeAverage(); // NOT: compAvg();
    有兩種類型的單詞需要注意。第?種是詞典中列出的普通詞灰署,這些不得簡寫判帮,千萬不要這樣寫:
    cmd 代替 command
    cp 代替 copy
    pt 代替 point
    comp 代替 compute
    init 代替 initialize

    另?種是具有特殊含義的詞組,通過他們的縮略詞可以更?然的為?們所知溉箕,這些詞組要保持縮略形
    式晦墙,千萬不要這樣寫:
    HypertextMarkupLanguage 代替 html
    CentralProcessingUnit 代替 cpu
    PriceEarningRatio 代替 pe
  28. 最好避免特殊地命名指針。
    Line* line; // NOT: Line* pLine;
    // NOT: LIne* linePtr;
    C/C++環(huán)境有許多指針類型的變量肴茄,所以很多規(guī)定?乎?法遵守晌畅。此外,程序員應當忽略C++的對象通
    常斜體的特殊慣例寡痰。只有當對象的實際類型具有特殊意義抗楔,名稱才應強調類型。
  29. 最好避免出現(xiàn)否定的布爾變量名拦坠。
    bool isError; // NOT: isNoError
    bool isFound; // NOT: isNotFound
    當?個名稱出現(xiàn)雙重否定時连躏,會出現(xiàn)問題。因為不能從!isNotFound直接看出其含義贞滨。
  30. 枚舉常量建議以共同的類型名作為前綴入热。
    enum Color {
    COLOR_RED,
    COLOR_GREEN,
    COLOR_BLUE
    };
    在聲明處給出額外的信息,可以看出哪些常量是共通的晓铆,以及這些常量所代表的意義勺良。?種代替?案是
    總是通過共同的類型名聯(lián)系這些常量:Color::RED, Airline::AIR_FRANCE等。
    注意尤蒿,枚舉名應當是典型的單數(shù)Color {...}郑气。?個復數(shù)的名稱像Colors {...},在聲明時并沒有什么區(qū)別腰池,
    但這樣的?法看起來?較笨拙尾组。
  31. 例外的類推薦加上后綴Exception忙芒。
    class AccessException
    {
    :
    }
    例外的類其實不是程序主要設計的?部分,通過命名讓它們相對于其他類更加突出讳侨。
  32. 函數(shù)(具有返回值的?法)推薦命名為它們執(zhí)?后的返回或者規(guī)程(void型?法)呵萨。
    增加代碼可讀性。使得可以很清晰的看出其功能跨跨,尤其是其不?持什么功能潮峦。這將再?次使代碼簡化避
    免副作?的產(chǎn)?。
    4 ?件
    4.1 源?件
  33. C++頭?件推薦以.h(推薦)或.hpp作為擴展名勇婴。源?件應該為.c++(推薦)忱嘹,.c,.cc或.cpp耕渴。
    MyClass.c++, MyClass.h
    以上均為C++標準?持的?件后綴名拘悦。
  34. 類推薦在頭?件中聲明,并在類名和?件名匹配的源?件中定義橱脸。
    MyClass.h, MyClass.c++
    易于找到給定類的相關?件础米。?個明顯的例外,即模版類聲明和定義必須在同?個.h?件內添诉。
  35. 推薦把所有的定義包含在源?件中屁桑。
    class MyClass
    {
    public:
    int getValue () {return value_ ;} // NO!
    ...
    private:
    int value_;
    }
    頭?件應當聲明?個接?,源?件應執(zhí)?它栏赴。當尋找,執(zhí)?時蘑斧,程序員應總是清楚它可以在源?件中找
    到。
  36. ?件?錄必須在80列內艾帐。
    80列是編輯器乌叶,終端,顯?端和調試器中共同的寬度柒爸,并且?件將在很多?中共享准浴,所以應當保持這些
    系統(tǒng)規(guī)定參數(shù)。在程序員之間傳遞代碼時捎稚,避免?意義的斷?乐横,能夠提升代碼可讀性。
  37. 分?符和Tab等特殊符號必須避免在程序中出現(xiàn)今野。
    這些字符?在多?編程葡公,多平臺時將必定導致編輯器,顯?端条霜,終端模擬器或者調試器出現(xiàn)問題催什。
  38. 分?顯?的代碼必須使其顯?易?[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 包含?件和包含語句
  39. 頭?件必須放在?個保護裝置中。

ifndef COMCOMPANYMODULECLASSNAMEH

define COMCOMPANYMODULECLASSNAMEH

:

endif // COMCOMPANYMODULECLASSNAMEH

這個結構是為了避免產(chǎn)?編譯錯誤旋圆。
這個命名規(guī)定統(tǒng)?了源代碼中頭?件的位置宠默,避免了命名沖突。

  1. Include語句推薦將其按分類排級灵巧,并按等級從低到?排序搀矫。在兩個Include語句類之間空?分隔。

include

include

include

include

include "com/company/ui/PropertiesDialog.h"

include "com/company/ui/MainWindow.h"

除了展?給閱讀代碼者清晰的包含?件結構刻肄,同樣可以直接看出涉及哪些模塊瓤球。
Include?件?錄不能使?絕對路徑。編譯器指令應改為?于為包含的?件指?根?錄敏弃。

  1. include語句必須只放在?件頂端冰垄。
    通?規(guī)范。避免隱藏(在?件內)的include語句產(chǎn)?編譯錯誤权她。
    5 語句
    5.1 類型
  2. 在?件內部使?的量的類型建議在此?件內聲明。
    確保信息隱藏逝薪。
  3. 類的?部分必須分為公共隅要,保護和私有三部分[2][3]。所有部分必須明確董济。不合適的部分不應
    混在?起步清。
    順序通常為將public部分放在最上,所以當?們可以看到protected/private部分即可不再閱讀虏肾。
  4. 類型轉換必須明確作出廓啊。絕不能依賴隱性類型轉換。
    floatValue = static_cast(intValue); // NOT: floatValue = intValue;
    通過這點封豪,程序員可以意識到涉及到的不同類型谴轮,并且混合是有意的。
    5.2 變量
  5. 變量推薦在聲明處初始化吹埠。
    這確保了變量在任何時候都是有效的第步。有時不能以?個有效值初始化變量,就像:
    int x, y, z;
    getCenter(&x, &y, &z);
    這些情況缘琅,應當保持未初始化粘都,這要好于初始化假值。
  6. 變量絕不能擁有雙重含義刷袍。
    通過確保變量唯?地代表概念來提升代碼可讀性翩隧。減少副作?導致錯誤的機會。
  7. 盡量避免使?全局變量呻纹。
    在C++中堆生,全局變量并不是必需的专缠。同樣適?于全局函數(shù)或者?件范圍的(靜態(tài))變量。
  8. 類中變量盡量不要在public中聲明顽频。
    公有變量將會破環(huán)C++的信息隱藏性和封裝性藤肢。使?私有變量和訪問函數(shù)代替。這種規(guī)則的?種例外是
    當類本質上是沒有?為(類似C的結構體)的?種數(shù)據(jù)結構糯景。這種情況下嘁圈,讓實例變量變公有是恰當?shù)?br> [2]。
    注意:C++的結構體只是為了和C語?的?致性蟀淮,并通過減少構建結構體的數(shù)量避免增加代碼可讀性最住。使
    ?類來代替。
  9. C++的指針和引?的符號推薦靠近類型名怠惶,?不是靠近名稱涨缚。
    float* x; // NOT: float *x;
    int& y; // NOT: int &y ;
    變量的指針或者引?屬性是類型的性質,?不是命名的策治。C語?程序員經(jīng)常在兩者中取舍脓魏,?C++中遵守
    這個規(guī)則已越來越普遍。
  10. 隱式測試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++看起來很普遍也可以使?悔政。
  11. 推薦在盡可能?的范圍內進?變量聲明。
    在?范圍保持變量的操作延旧,這樣可以更簡單的控制其作?和副作?谋国。
  12. 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)包含更加清晰烹卒。
  13. 循環(huán)變量推薦在循環(huán)之前被初始化吉捶。
    isDone = false; // NOT: bool isDone = false;
    while (!isDone) { // :
    : // while (!isDone) {
    } // :
    // }
  14. 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)卤档。減少這種結構的使?來
    提?代碼可讀性。
  15. 循環(huán)體的break和continue建議避免使?谣辞。
    如果這些語句相較于同樣的結構化代碼可以提?代碼可讀性迫摔,否則建議不使?。
  16. while(true)這種形式推薦?于?限循環(huán)中泥从。
    while (true) {
    :
    }
    for (;;) { // NO!
    :
    }
    while (1) { // NO!
    :
    }
    依靠對于1進?的測試既沒有必要也沒有意義句占。for (;;)可讀性極差,并且表?上看不出它實際是個?限循
    環(huán)躯嫉。
    5.4 條件語句
  17. 復雜的條件表達式必須避免纱烘。引?臨時布爾變量代替[1]。
    bool isFinished = (elementNo < 0)
    bool isRepeatedEntry = elementNo == lastElement;
    if (isFinished
    :
    }
    // NOT:
    if ((elementNo < 0)
    elementNo == lastElement) {
    :
    }
    通過給表達式分配布爾變量祈餐,程序可以?動記錄(分析)擂啥。這樣的結構造可以更簡單的閱讀,改正和維
    護帆阳。
  18. if語句中哺壶,象征性的部分推薦放在if()部分,例外放在else()部分蜒谤。
    bool isOk = readFile (fileName);
    if (isOk) {
    :
    }
    else {
    :
    }
    確保例外不會使得正常路徑難以理解山宾。這對于代碼的可讀性和性能均很重要。
  19. 條件語句推薦放在單獨的??鳍徽。
    if (isDone) // NOT: if (isDone) doCleanup();
    doCleanup();
    這是為了?便調試塌碌。當寫在??中,?法清晰的知道真或假旬盯。
  20. 條件語句中的執(zhí)?語句必須避免。
    File* fileHandle = open(fileName, "w");
    if (!fileHandle) {
    :
    }
    // NOT:
    if (!(fileHandle = open(fileName, "w"))) {
    :
    }
    條件語句中的執(zhí)?語句使得代碼難以閱讀翎猛。這需要C/C++的新程序員尤其注意胖翰。
    5.5 雜項
  21. 代碼中推薦盡量避免幻數(shù)的使?。除了0和1切厘,其他的推薦考慮聲明常量代替萨咳。
    如果?個數(shù)字??沒有?個顯?易?的含義,通過引?命名常量代替來增加代碼可讀性疫稿。另?種不同的
    ?法是在量被訪問處引??個?法(函數(shù))培他。
  22. 浮點數(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)分配的類型猛遍,雖然這可能看起來不
    太明顯。
  23. ?于0的浮點數(shù)推薦總是在?數(shù)點前寫上數(shù)碼0。
    double total = 0.5; // NOT: double total = .5;
    C++的數(shù)字和表達式系統(tǒng)借鑒于數(shù)學懊烤,并且語法應當只要允許就遵守數(shù)學慣例梯醒。同樣,0.5的可讀性明顯
    ?于.5腌紧;也不會使其和5混淆茸习。
  24. 函數(shù)必須要明確列出返回值類型。
    int getValue() // NOT: getValue()
    {
    :
    }
    如果沒有明確列出壁肋,C++將會默認返回值為int型号胚。程序員不得依賴這個特點,因為這會使其他程序員覺
    得這種形式難以理解墩划。
  25. goto語句推薦盡量避免使?涕刚。
    goto語句打破了代碼的結構。只有在?常少的情況下(例如跳出?個深層的嵌套結構)goto語句建議考
    慮乙帮,并且僅當替代的選擇結構被證明有較差的可讀性杜漠。
  26. 0推薦?來代替NULL。
    NULL是標準C語?庫的部分察净,但在C++中已被淘汰驾茴。
    6.1 布局
  27. 基本的縮進推薦為2個空格。
    for (i = 0; i < nElements; i++)
    a[i] = 0;
    縮進1對于強調代碼的邏輯布局顯得太短氢卡。
    縮進?于4使得深層的嵌套代碼很難閱讀锈至,并且增加了必須分?的可能。選擇縮進2译秦,3峡捡,4之?,2和4更
    加普遍筑悴,且選擇2可以降低代碼分?的可能们拙。
  28. 代碼塊的布局推薦如例1(推薦)或者例2,但絕不要如例3[4]阁吝。函數(shù)和類代碼塊必須使?例2的布
    局砚婆。
    while (!done) {
    doSomething();
    done = moreToDo();
    }
    while (!done)
    {
    doSomething();
    done = moreToDo();
    }
    while (!done)
    {
    doSomething();
    done = moreToDo();
    }
    例3引??個特別的縮進,使得強調的代碼邏輯結構不如例1和例2清晰突勇。
  29. 類推薦使?以下格式聲明:
    class SomeClass : public BaseClass
    {
    public:
    ...
    protected:
    ...
    private:
    ...
    }
    這?定程度上遵守了以上通?的代碼塊規(guī)則装盯。
  30. ?法(函數(shù))推薦使?以下格式定義:
    void someMethod()
    {
    ...
    }
    這遵守了以上通?的代碼塊規(guī)則。
  31. 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部分時海蔽。
  32. for語句推薦使?以下格式:
    for (initialization; condition; update) {
    statements;
    }
    這遵守了以上通?的代碼塊規(guī)則。
  33. 空的for語句推薦使?以下格式:
    for (initialization; condition; update)
    ;
    這強調了for語句是空的绑谣,并且由于這是故意的所以使得代碼閱讀者清楚党窜。不過,空循環(huán)應當避免借宵。
  34. while語句推薦使?以下格式:
    while (condition) {
    statements;
    }
    這遵守了以上通?的代碼塊規(guī)則幌衣。
  35. do-while語句推薦使?以下格式:
    do {
    statements;
    } while (condition);
    這遵守了以上通?的代碼塊規(guī)則。
  36. switch語句推薦使?以下格式:
    switch (condition) {
    case ABC :
    statements;
    // Fallthrough
    case DEF :
    statements;
    break;
    case XYZ :
    statements;
    break;
    default :
    statements;
    break;
    }
    注意整個switch語句中每個case關鍵字相對縮進壤玫。這使得整個switch語句清晰突出豁护。此外注意“:”前的額
    外的空格。當case語句不包含break語句應當有明確的貫穿注釋欲间。省略break是個普通錯誤楚里,如果故意省
    略必須要讓代碼清晰。
  37. try-catch語句推薦使?以下格式:
    try {
    statements;
    }
    catch (Exception& exception) {
    statements;
    }
    這?定程度上遵守了以上通?的代碼塊規(guī)則猎贴。if-else語句關于?括號的規(guī)則通樣可以運?于try-catch語
    句班缎。
  38. 單獨的if-else,for她渴,或while語句建議不加?括號达址。
    if (condition)
    statement;
    while (condition)
    statement;
    for (initialization; condition; update)
    statement;
    通常推薦應當是在任何情況?括號都不應缺少。但是趁耗,通常語?構造中?括號是?來歸納多條語句沉唠。單
    條語句使??括號會顯得多余。不過苛败,有?種反對此語法的聲?满葛,如果增加語句?忘記加?括號,代碼
    就會出錯罢屈。但不論怎樣嘀韧,代碼絕不應當為了適應可能發(fā)?的改變。
  39. 函數(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++代碼中绩衷,很難給出?個完整的空格使?建議列
表。以上的例?只是給出?個通常的建議。

  1. ?法(函數(shù))名后若相連其他名稱咳燕,建議以空格隔開勿决。
    doSomething (currentFile);
    讓每個名稱獨?出來。增加代碼可讀性招盲。當后?沒有名稱低缩,空格可以省略(doSomething()),這種情況名
    稱就不?獨?曹货。左圓括號后是否加空格這個規(guī)范并沒有要求咆繁,即都是可以的。這個規(guī)范通常在右括號前
    留?個空格: doSomething( currentFile ); 這樣做使得每個名稱作為不同含義?獨?顶籽,但是右括號前的
    空格更像是?種藝術玩般,并且沒有那個空格的語句會顯得不對稱(doSomething( currentFile);)。
  2. 邏輯集合代碼塊推薦以空?分隔礼饱。
    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);
    通過在不同的邏輯集合代碼塊加?空?增加代碼可讀性坏为。
  3. ?法(函數(shù))推薦以三個空?分隔。
    通過?空?使得?法(函數(shù))在類中獨?慨仿。
  4. 變量聲明建議左對?久脯。
    AsciiFile* file;
    int nPoints;
    float x, y;
    增加代碼可讀性。變量可以通過對?簡單的分別類型镰吆。
  5. 當使?對?可以增加代碼可讀性就使?對?帘撰。
    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 注釋
  6. ?厘頭的代碼不需要注釋蹬耘,需要重寫![1]减余。
    通常综苔,注釋應當通過代碼命名的選擇和明確的邏輯結構提升???檔化?盡量減少使?。
  7. 所有注釋推薦使?英?書寫[2]位岔。
    在國際化開發(fā)環(huán)境中如筛,英?是?選語?。
  8. 所有注釋均?//抒抬,包括多?注釋杨刨。
    // Comment spanning
    // more than one line.
    ?從多級C注釋不被?持,使?//注釋確保注釋所有?件部分總是可能的擦剑。調試等?的時使?/**/妖胀。
    推薦真正注釋和//之間保留?個空格芥颈,并且注釋應當以?個?寫字?開頭,以句號結束赚抡。
  9. 推薦將注釋和代碼同等位置(縮進)爬坑。
    while (true) { // NOT: while (true) {
    // Do something // Do something
    something(); something();
    } }
    這是為了避免注釋打破程序的邏輯結構。
  10. 類和?法的初始注釋推薦依照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/ 處獲得末捣。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末侠姑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箩做,更是在濱河造成了極大的恐慌莽红,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邦邦,死亡現(xiàn)場離奇詭異安吁,居然都是意外死亡,警方通過查閱死者的電腦和手機燃辖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門鬼店,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黔龟,你說我怎么就攤上這事妇智。” “怎么了氏身?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵巍棱,是天一觀的道長。 經(jīng)常有香客問我观谦,道長拉盾,這世上最難降的妖魔是什么桨菜? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任豁状,我火速辦了婚禮捉偏,結果婚禮上,老公的妹妹穿的比我還像新娘泻红。我一直安慰自己夭禽,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布谊路。 她就那樣靜靜地躺著讹躯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缠劝。 梳的紋絲不亂的頭發(fā)上潮梯,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音惨恭,去河邊找鬼秉馏。 笑死,一個胖子當著我的面吹牛脱羡,可吹牛的內容都是我干的萝究。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼锉罐,長吁一口氣:“原來是場噩夢啊……” “哼帆竹!你這毒婦竟也來了?” 一聲冷哼從身側響起脓规,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤栽连,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抖拦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體升酣,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年态罪,在試婚紗的時候發(fā)現(xiàn)自己被綠了噩茄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡复颈,死狀恐怖绩聘,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情耗啦,我是刑警寧澤凿菩,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站帜讲,受9級特大地震影響衅谷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜似将,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一获黔、第九天 我趴在偏房一處隱蔽的房頂上張望蚀苛。 院中可真熱鬧,春花似錦玷氏、人聲如沸堵未。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渗蟹。三九已至,卻和暖如春赞辩,著一層夾襖步出監(jiān)牢的瞬間雌芽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工辨嗽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膘怕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓召庞,卻偏偏與公主長得像岛心,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篮灼,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容

  • 第一部分 打好基礎 Laying the Foundation 第一章 歡迎進入軟件構建的世界 Welcome t...
    白樺葉閱讀 4,623評論 0 17
  • 本文檔講述了Java語言的編碼規(guī)范忘古,較之陳世忠先生《c++編碼規(guī)范》的浩繁詳盡,此文當屬短小精悍了诅诱。而其中所列之各...
    蟻前閱讀 908評論 0 51
  • 禪與 Objective-C 編程藝術 (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,623評論 1 10
  • 孩子使我們人與人之前多了一些交往髓堪,記得我家寶寶剛會講話叫爺爺時,抱出去看到年紀大的就對著老人笑叫爺爺娘荡,把人家叫的一...
    熱愛生活CHJ閱讀 271評論 0 2
  • 大部分人都是不好不壞干旁,平庸乏味,跟一次性塑料飯盒一樣炮沐。對這種長方形塑料争群,你連聞一聞的興趣都不會有。大多數(shù)音樂大年、大部...
    暖暖的小南閱讀 224評論 0 0