C語言變數名的命名規則

來源:互聯網
上載者:User
標題:C語言中,變數名的命名規則?詳細說明!
出處:BruCe's Blog 石器時代,石器私服,石器時代私服,石器2.5私服,石器時代2.5私服,石器3.0私服,石器時代3.0私服
時間:Wed, 28 Apr 2010 11:41:11 +0000
作者:BruCe
地址:http://www.mrlunet.com/read.php?35

內容:
一、程式風格:    
    1、嚴格採用階梯層次組織程式碼:    
    各層次縮排的分格採用VC的預設風格,即每層次縮排為4格,括弧位於下一行。要求相匹配的大括弧在同一列,對繼行則要求再縮排4格。例如:    
    2、提示資訊字串的位置    
    在程式中需要給出的提示字串,為了支援多種語言的開發,除了一些給調試用的臨時資訊外,其他所有的提示資訊必須定義在資源中。    
    3、對變數的定義,盡量位於函數的開始位置。    
二、命名規則:    
    1、變數名的命名規則    
    ①、變數的命名規則要求用“匈牙利法則”。即開頭字母用變數的類型,其餘部分用變數的英文意思或其英文意思的縮寫,盡量避免用中文的拼音,要求單詞的第一個字母應大寫。    
    即:    變數名=變數類型+變數的英文意思(或縮寫)    
    對非通用的變數,在定義時加入注釋說明,變數定義盡量可能放在函數的開始處。    
    見下表:    
    bool(BOOL)    用b開頭    bIsParent    
    byte(BYTE)    用by開頭    byFlag    
    short(int)    用n開頭    nStepCount    
    long(LONG)    用l開頭    lSum    
    char(CHAR)    用c開頭    cCount    
    float(FLOAT)    用f開頭    fAvg    
    double(DOUBLE)    用d開頭    dDeta    
    void(VOID)    用v開頭    vVariant    
    unsigned    int(WORD)    用w開頭    wCount    
    unsigned    long(DWORD)    用dw開頭    dwBroad    
    HANDLE(HINSTANCE)    用h開頭    hHandle    
    DWORD    用dw開頭    dwWord    
    LPCSTR(LPCTSTR)    用str開頭    strString    
    用0結尾的字串    用sz開頭    szFileName    
    
    對未給出的變數類型要求提出並給出命名建議給技術委員會。    
    
    ②、指標變數命名的基本原則為:    
    對一重指標變數的基本原則為:    
    “p”+變數類型首碼+命名    
    如一個float*型應該表示為pfStat    
    對多重指標變數的基本規則為:    
    二重指標:    “pp”+變數類型首碼+命名    
    三重指標:    “ppp”+變數類型首碼+命名    
    ......    
    ③、全域變數用g_開頭,如一個全域的長型變數定義為g_lFailCount,即:變數名=g_+變數類型+變數的英文意思(或縮寫)    
    ④、靜態變數用s_開頭,如一個靜態指標變數定義為s_plPerv_Inst,即:    變數名=s_+變數類型+變數的英文意思(或縮寫)    
    ⑤、成員變數用m_開頭,如一個長型成員變數定義為m_lCount;即:變數名=m_+變數類型+變數的英文意思(或縮寫)    
    ⑥、對枚舉類型(enum)中的變數,要求用枚舉變數或其縮寫做首碼。並且要求用大寫。    
    如:enum    cmEMDAYS    
    {    
    EMDAYS_MONDAY;    
    EMDAYS_TUESDAY;    
    ……    
    };    
    ⑦、對struct、union、class變數的命名要求定義的類型用大寫。並要加上首碼,其內部變數的命名規則與變數命名規則一致。    
    結構一般用S開頭    
    如:struct    ScmNPoint    
    {    
    int    nX;//點的X位置    
    int    nY;    //點的Y位置    
    };    
    聯合體一般用U開頭    
    如:    union    UcmLPoint    
    {    
    long    lX;    
    long    lY;    
    }    
    類一般用C開頭    
    如:    
    class    CcmFPoint    
    {    
    public:    
    float    fPoint;    
    };    
    對一般的結構應該定義為類模板,為以後的擴充性考慮    
    如:    
    template    
    class    CcmTVector3d    
    {    
    public:    
    TYPE    x,y,z;    
    };    
    ⑧、對常量(包括錯誤的編碼)命名,要求常量名用大寫,常量名用英文表達其意思。    
    如:#define    CM_FILE_NOT_FOUND    CMMAKEHR(0X20B)    其中CM表示類別。    
    ⑨、對const    的變數要求在變數的命名規則前加入c_,即:c_+變數命名規則;例如:    
    const    char*    c_szFileName;    
    2、    函數的命名規範:    
    函數的命名應該盡量用英文表達出函數完成的功能。遵循動賓結構的命名法則,函數名中動詞在前,並在命名前加入函數的首碼,函數名的長度不得少於8個字母。    
    例如:    
    long    cmGetDeviceCount(……);    
    3、函數參數規範:    
    ①、    參數名稱的命名參照變數命名規範。    
    ②、    為了提高程式的運行效率,減少參數佔用的堆棧,傳遞大結構的參數,一律採用指標或引用方式傳遞。    
    ③、    為了便於其他程式員識別某個指標參數是入口參數還是出口參數,同時便於編譯器檢查錯誤,應該在入口參數前加入const標誌。如:    
    ……cmCopyString(const    char    *    c_szSource,    char    *    szDest)    
    4、引出函數規範:    
    對於從動態庫引出作為二次開發函數公開的函數,為了能與其他函數以及Windows的函數區分,採用類別首碼+基本命名規則的方法命名。例如:在對動態庫中引出的一個圖象編輯的函數定義為    

imgFunctionname(其中img為image縮寫)。    
    現給出三種庫的命名首碼:    
    ①、    對通用函數庫,採用cm為首碼。    
    ②、    對三維函數庫,採用vr為首碼。    
    ③、    對圖象函數庫,採用img為首碼。    
    對宏定義,結果代碼用同樣的首碼。    
    5、檔案名稱(包括動態庫、組件、控制項、工程檔案等)的命名規範:    
    檔案名稱的命名要求表達出檔案的內容,要求檔案名稱的長度不得少於5個字母,嚴禁使用象file1,myfile之類的檔案名稱。    
三、注釋規範:    
    1、函數頭的注釋    
    對於函數,應該從“功能”,“參數”,“傳回值”、“主要思路”、“調用方法”、“日期”六個方面用如下格式注釋:    
    //程式說明開始    
    //================================================================//    
    //    功能:    從一個String    中刪除另一個String。    
    //    參數:    strByDelete,strToDelete    
    //    (入口)    strByDelete:    被刪除的字串(原來的字串)    
    //    (出口)    strToDelete:    要從上個字串中刪除的字串。    
    //    返回:    找到並刪除返回1,否則返回0。(對傳回值有錯誤編碼的要//    求列出錯誤編碼)。    
    //    主要思路:本演算法主要採用迴圈比較的方法來從strByDelete中找到    
    //    與strToDelete相匹配的字串,對多匹配strByDelete    
    //    中有多個strToDelete子串)的情況沒有處理。請參閱:    
    //    書名......    
    //    調用方法:......    
    //    日期:起始日期,如:2000/8/21.9:40--2000/8/23.21:45    
    //================================================================//    
    函數名(……)    
    //程式說明結束    
    ①、    對於某些函數,其部分參數為傳入值,而部分參數為傳出值,所以對參數要詳細說明該參數是入口參數,還是出口參數,對於某些意義不明確的參數還要做詳細說明(例如:以角度作為參

數時,要說明該角度參數是以弧度(PI),還是以度為單位),對既是入口又是出口的變數應該在入口和出口處同時標明。等等。    
    ②、    函數的注釋應該放置在函數的標頭檔中,在實現檔案中的該函數的實現部分應該同時放置該注釋。    
    ③、    在注釋中應該詳細說明函數的主要實現思路、特別要註明自己的一些想法,如果有必要則應該寫明對想法產生的來由。對一些模仿的函數應該注釋上函數的出處。    
    ④、    在注釋中詳細註明函數的適當調用方法,對於傳回值的處理方法等。在注釋中要強調調用時的危險方面,可能出錯的地方。    
    ⑤、    對日期的注釋要求記錄從開始寫函數到結束函數的測試之間的日期。    
    ⑥、    對函數注釋開始到函數命名之間應該有一組用來標識的特殊字元串。    
    如果演算法比較複雜,或演算法中的變數定義與位置有關,則要求對變數的定義進行圖解。對難以理解的演算法能圖解盡量圖解。    
    2、變數的注釋:    
    對於變數的注釋緊跟在變數的後面說明變數的作用。原則上對於每個變數應該注釋,但對於意義非常明顯的變數,如:i,j等迴圈變數可以不注釋。    
    例如:    long    lLineCount    //線的根數。    
     3、檔案的注釋:    
    檔案應該在檔案開頭加入以下注釋:    
    /////////////////////////////////////////////////////////////////////    
    //    工程:    檔案所在的項目名。    
    //    作者:**,修改者:**    
    //    描述:說明檔案的功能。    
    //    主要函數:…………    
    //    版本:    說明檔案的版本,完成日期。    
    //    修改:    說明對檔案的修改內容、修改原因以及修改日期。    
    //    參考文獻:    ......    
    /////////////////////////////////////////////////////////////////////    
    為了標頭檔被重複包含要求對標頭檔進行定義如下:    
    #ifndef    __FILENAME_H__    
    #define    __FILENAME_H__    
    其中FILENAME為標頭檔的名字。    
       4、其他注釋:    
    在函數內我們不需要注釋每一行語句。但必須在各功能模組的每一主要部分之前添加塊注釋,注釋每一組語句,在迴圈、流程的各分支等,儘可能多加以注釋。    
    其中的迴圈、條件、選擇等位置必須注釋。    
    對於前後順序不能顛倒的情況,建議在注釋中增加序號。    
    例如:    
    在其他順序執行的程式中,每隔3—5行語句,必須加一個注釋,註明這一段語句所組成的小模組的作用。對於自己的一些比較獨特的思想要求在注釋中標明。    
四、程式健壯性:    
    1、函數的傳回值規範:    
    對於函數的返回位置,盡量保持單一性,即一個函數盡量做到只有一個返回位置。(單入口單出口)。    
    要求大家統一函數的傳回值,所有的函數的傳回值都將以編碼的方式返回。    
    例如編碼定義如下:    
    #define    CM_POINT_IS_NULL    CMMAKEHR(0X200)    
    :    
    :    
    建議函數實現如下:    
    long    函數名(參數,……)    
    {    
    long    lResult;    //保持錯誤號碼    
    lResult=CM_OK;    
    //如果參數有錯誤則返回錯誤號碼    
    if(參數==NULL)    
    {    
    lResult=CM_POINT_IS_NULL;    
    goto    END;    
    }    
    ……    
    END:    
    return    lResult;    
    }    
    2、關於goto的應用:    
    對goto語句的應用,我們要求盡量少用goto語句。對一定要用的地方要求只能向後轉移。    
    3、資源變數的處理(資源變數是指消耗系統資源的變數):    
    對資源變數一定賦初值。分配的資源在用完後必須馬上釋放,並重新賦值。    
    4、對複雜的條件判斷,為了程式的可讀性,應該盡量使用括弧。    
    例:if(((szFileName!=NULL)&&(lCount>=0)))||(bIsReaded==TRUE))    
 
五、可移植性:    
    1、高品質的代碼要求能夠跨平台,所以我們的代碼應該考慮到對不同的平台的支援,特別是對windows98和windowsnt的支援。    
    2、由於C語言的移植性比較好,所以對演算法函數要求用C代碼,不能用C++代碼。    
    3、對不同的硬體與軟體的函數要做不同的處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.