C/C++代碼規範

命名

命名,包括文件名、類名、結構名、類型名、函數名、變量名、參數名等都是程序設計中重要的一部分。一個好的名稱,體現了一個深思熟慮的過程,同時也 能夠幫助別人更好地理解開發者的思路。如果發現程序中,充滿了a, b, c, x, y, z, tmp這種命名的變量,這時候就需要仔細的考慮自己的實現是否有問題。

類(結構)名

  • 類名必須是名詞,類名必須明確表示這個類代表了什麼。
  • 如果類名超過3個單詞,說明這個類有可能需要拆分了。
  • 不要把父類的名字帶到子類中。
  • 類名加上後綴也是一種選擇。如下載代理類,可以寫爲DownloadProxy。
  • 類名首字母大寫;用大寫字母分隔單詞,除單詞的首字母外,全部小寫;類名中不要出現下劃線“_”。

類(結構)屬性名

  • 屬性由成員前綴”m_“屬性,屬性名採用匈牙利命名規範。

方法

  • 方法與函數執行一個任務,因此應當用動詞來命名。比方說,DumpDataToFile()就要好於DataFile()。
  • 方法名首字母大寫;用大寫字母分隔單詞,除單詞的首字母外,全部小寫,方法名中不要出現下劃線。

函數

  • 方法與函數執行一個任務,因此應當用動詞來命名。
  • 函數名全部小寫,單詞之間用下劃線分隔。

方法與函數參數名

  • 首字母小寫。
  • 除了第一個單詞,所有單詞的首字母大寫。
  • 名稱中不應出現”_”。

類庫名

  • 如果使用C書寫類庫,或在C++不使用namespace書寫類庫,爲了避免命名衝突,需要在類名,結構名,函數名前加上類庫名前綴。類庫名應當簡潔、明確。 如:
    ImEgg* ImEgg_new();   
    

變量名

  • 變量名使用匈牙利命名規則。
  • 全部小寫字母。
  • 使用”_”作爲分隔符。
  • 唯一能違反以上命名規則的,是一些循環中需要用到的自增變量。 如:
    int fun(Point* pPoint)
    {
        Point* p_nest_point = pPoint;
        char* p = NULL;
        char sz_buf[255];
        for (int i = 0; i < 50 && (sz_buf+p++) != ' '; i++)
        {
            // do stuff
        }
    }
    
    p point
    b byte
    w word
    dw double word
    ch char
    wch wide char
    n number
    sz char[]
    f bool
    fn function pointer
    v void
    lpsz char* terminated by zero

指針變量

  • 指針變量應在類型前加上p前綴,其後變量名命名規則不變。
  • *號永遠靠近類型,一行聲明中只出現一個指針變量。 如:
       Point* p_point;
    

引用變量

  • 引用變量應在類型前加上r前綴,其後變量名命名規則不變。

全局變量

  • 全用變量應使用g_屬性描述,其後變量名命名規則不變。 如:
    ImLog4c* g_pLogger;
    

靜態變量

  • 靜態變量應使用s_屬性描述,其後變量名命名規則不變。
    ImLog4c* s_pLogger;
    

枚舉類型

  • 枚舉類型命名規則使用大寫字母,用下劃線分隔單詞。
    Enum PIN
    {
    PIN_ON = 1;
    PIN_OFF;
    };
    

  • 宏命名規則使用大寫字母,用下劃線分隔單詞。
    #define MAX_LENGTH 50
    #define MAX(a, b) (a)>(b)?(a):(b)
    

集合名稱

  • 集合名稱使用複數,其它與變量名規範相同。
    GList* edges = g_list_new();
    vector<Edge> edges;
    typedef vector<Edge> EdgeVector;
    typedef map<string, EdgeVector> EdgeMap;
    typedef list<EdgeMap> EdgeList;
    

格式

{}規則

  • “{“與”}”單獨佔一行。
  • “{“與”}”與上一行行首對齊。
  • If與while後哪怕只有一句話,也要加上“{“與”}”。
       while (*(buf+p++) != ' ')
    printf("hello\n");
    

()規則

  • "("與前一個關鍵字之間留一個空格。
  • "("與前函數名之間不需要留一個空格。
  • Return語句儘可能不要用"()"
    return (a*b^2>100)?(a):(b);
    

縮進規則

  • 縮進永遠爲4。
  • 用空格代替tab。
  • Tab永遠用4。
  • 如果縮進超過5層,考慮代碼優化。

列長度

  • 一列不應該超過80個英文字符。
  • 一個聲明佔一行
  • 一個聲明佔一行。

三元表達式

  • 條件表達式佔一行
  • then與else應單獨佔一行。
    (condition) ? funct1() : func2();   
    Or
       (condition)
          ? long statement
          : another long statement;
    

頭文件順序

  • 頭文件應當按照與功能的特點性從高到低排列。順序爲
  • 當前目錄的頭文件。
  • 自行開發庫的頭文件。
  • 第三方庫的頭文件。
  • 標準C++頭文件。
  • 標準C頭文件。

空格

  • 操作符需要加上空格。
  • 關鍵字前後要加上空格。
  • 逗號後要加上空格。
  • 冒號後要加上空格。
  • 在一行內的分號後要加上空格,行末的分號不要空格。
    fun(a, b);
    for (int I = 0; I < 50; i++);
    

類與結構

類文件與結構文件命名

  • 公有類,C中用以模擬類的結構,需要位於一個獨立的文件中。
  • 文件名與公有類名,C中用以模擬類的結構名相同。

類與結構頭文件佈局

  • 文件描述,使用Doxygen語法。
  • 頭文件保護宏。
  • 頭文件。
  • 類或結構描述,使用Doxygen語法。
  • 類或結構名。
  • 屬性描述,使用Doxygen語法。以下每個屬性或方法都要求對應一個描述。
  • 屬性聲明。
  • C++與身命週期相關函數聲明。C++中的構造方法,析構方法以及工廠方法。
  • C++操作符重載。
  • C++訪問器,get與set方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章