天天看點

C++編碼規範概述C++中禁止不建議使用的排版注釋宏變量、結構函數、過程源檔案命名規範

C++編碼規範

  • 概述
  • C++中禁止不建議使用的
  • 排版
  • 注釋
  • 變量、結構
  • 函數、過程
  • 源檔案命名規範

概述

本文章屬于我寫程式時會遵循的一些規範,也有參考其它公司的一些規範,并不全面,權當成一個筆記來看吧。

C++中禁止不建議使用的

  1. 盡量減少使用全局變量,而是改用靜态成員變量

排版

  • 程式塊要采用tab縮進風格編寫,tab縮進的空格數為4個。
    • 說明:對于由開發工具自動生成的代碼可以有不一緻。
  • 相對獨立的程式塊之間,變量說明之後必須加空行
  • 示例:
// 如下不符合規範
if(!vaild_ni(ni)){
	// ... program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;

// 應如下書寫
if(!vaild_ni(ni)){
	// ... program code
}

repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
           
  • 較長的語句(>80字元)要分成多行書寫長表達式要在低優先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行适當的縮進,使排版整齊,語句可讀。
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
                          + STAT_SIZE_PER_FRAM * sizeof( _UL );

act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied
              = stat_poi[index].occupied;
              
act_task_table[taskno].duration_true_or_false
              = SYS_get_sccp_statistic_state( stat_item );

report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)
                      && (n7stat_stat_item_valid (stat_item))
                      && (act_task_table[taskno].result_data != 0));
           
  • 循環、判斷等語句中若有較長的表達式或語句,則要進行适應的劃分,長表達式要在低優先級操作符處劃分新行,操作符放在新行之首。
if ((taskno < max_act_task_number)
    && (n7stat_stat_item_valid (stat_item))){
    // ... program code
}
           
  • 若函數或過程中的參數較長,則要進行适當的劃分。
n7stat_str_compare((BYTE *) & stat_object,
                   (BYTE *) & (act_task_table[taskno].stat_object),
                   sizeof (_STAT_OBJECT));
           
  • 不允許把多個短語句寫在一行中,即一行隻寫一條語句。
//  示例:如下例子不符合規範。
rect.length = 0;  rect.width = 0;

// 應如下書寫
rect.length = 0;
rect.width  = 0;
           
  • 程式塊的分界符(如C/C++語言的大括号‘{’和‘}’)函數和成員函數應各獨占一行并且位于同一列,同時與引用它們的語句左對齊,在函數體的開始、類的定義、結構的定義、枚舉的定義的程式都要采用如上的縮進方式; if、for、do、while、switch、case語句使用另一種方式,示例如下:
void example_fun(void)
{
	if(...){
		... //program code
	}
}
           
  • 在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之後或者前後要加空格;進行非對等操作時,如果是關系密切的立即操作符(如->),後不應加空格。
// 逗号、分号隻在後面加空格。
int a, b, c;

// 比較操作符, 指派操作符"="、 "+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前後加空格。
if (current_time >= MAX_TIME_VALUE)
a = b + c;
a *= 2;
a = b ^ 2; 

// "!"、"~"、"++"、"--"、"&"(位址運算符)等單目操作符前後不加空格。
*p = 'a';        // 内容操作"*"與内容之間
flag = !isEmpty; // 非操作"!"與内容之間
p = &mem;        // 位址操作"&" 與内容之間
i++;             // "++","--"與内容之間 

// "->"、"."前後不加空格。
p->id = pid;     // "->"指針前後不加空格 

// if、for、while、switch等與後面的括号間應加空格,使if等關鍵字更為突出、明顯。
if (a >= b && c > d)
           
  • 一行程式以小于80字元為宜,不要寫得過長。

注釋

  • 一般情況下,源程式有效注釋量必須在20%以上。
  • 注釋的原則是有助于對程式的閱讀了解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準确、易懂、簡潔。
  • 說明性檔案(如頭檔案.h檔案、.inc檔案、編譯說明檔案.cfg等)頭部應進行注釋,注釋必須列出:版權說明、版本号、生成日期、作者、内容、功能、與其它檔案的關系、修改日志等,頭檔案的注釋中還應有函數功能簡要說明。
  • 頭檔案注釋
/************************************************************
  Copyright (C), 1994-2019, XX. XX., XXX.
  FileName: test.cpp
  Author:                  
  Date:
  Version:         // 版本資訊
  Description:     // 子產品描述     
  Function List:   // 主要函數及其功能
    1. ...
  History:         // 曆史修改記錄
    1. Date:
       Author:
       Modification:
    2. ...
***********************************************************/
           
  • 函數注釋
/*************************************************
  Function:       // 函數名稱
  Description:    // 函數功能、性能等的描述
  Calls:          // 被本函數調用的函數清單
  Called By:      // 調用本函數的函數清單
  Table Accessed: // 被通路的表(此項僅對于牽扯到資料庫操作的程式)
  Table Updated:  // 被修改的表(此項僅對于牽扯到資料庫操作的程式)
  Input:          // 輸入參數說明,包括每個參數的作
                  // 用、取值說明及參數間關系。
  Output:         // 對輸出參數的說明。
  Return:         // 函數傳回值的說明
  Others:         // 其它說明
*************************************************/
           
  • 邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一緻性。不再有用的注釋要删除。
  • 注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。
  • 注釋應考慮程式易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利準确的英文表達。

// 宏定義和枚舉全部使用 **全部大寫+下劃線** 的書寫方式
#define MY_MAX

enum MY_ENUM {
	MY_ENUM1,
	MY_ENUM2,
};
           

變量、結構

  • 對于所有的變量都會使用 小寫+下劃線的方式去書寫
  • 對于特殊情況, 例如某些變量名大小寫含義不同,則會使用大寫的方式
變量類型 命名規範 命名示例
局部變量 小寫+下劃線的方式書寫 is_init
成員變量 以m開頭的 小寫+下劃線的方式書寫 m_member
靜态成員變量 以s開頭的 小寫+下劃線的方式書寫 s_static_member
全局變量 以g開頭的 小寫+下劃線的方式書寫 g_static_member

函數、過程

函數 命名規範 命名示例
全局函數 小寫+下劃線的方式書寫 void my_sum(int a, int b)
成員函數名 采用開頭單詞字母大寫的方式書寫 void MySum(int a, int b)
類名 采用開頭單詞字母大寫的方式書寫 class MySum

源檔案命名規範

源檔案命名采用 單詞開頭字母大寫的方式進行命名 **MyCommon.h** **MyCommon.cpp**