C++編碼規範
- 概述
- C++中禁止不建議使用的
- 排版
- 注釋
- 宏
- 變量、結構
- 函數、過程
- 源檔案命名規範
概述
本文章屬于我寫程式時會遵循的一些規範,也有參考其它公司的一些規範,并不全面,權當成一個筆記來看吧。
C++中禁止不建議使用的
- 盡量減少使用全局變量,而是改用靜态成員變量
排版
- 程式塊要采用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)
注釋
- 一般情況下,源程式有效注釋量必須在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**