嵌入式c語言編碼規範
學習嵌入式的同學應該首先掌握嵌入式編碼規範,這樣才能更好的嵌入式系統。
下面就從這幾個方面講解一下嵌入式c編碼規範。
註釋風格、排版風格、標頭檔案風格、變數定義、宏定義、函式
1 註釋風格
1.1 註釋的原則是有助於對程式的閱讀和理解,註釋不宜太多也不能太少。註釋語言必須準確、易懂、簡潔,沒有歧義性。
1.2 程式檔案頭部程式碼應進行註釋。註釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其他檔案的關係、修改日誌等。標頭檔案的註釋中還應有函式功能簡要說明。
/*
* Copyright(C), 2007-2008, Red Hat Inc. // 版權宣告
* File name: // 檔名
* Author: // 作者
* Version: // 版本
* Date: // 完成日期
* Description: // 描述本檔案的功能,與其他模組的關係
* Function List: // 主要函式的列表,每條記錄應包括函式名及功能簡要說明
* History: // 修改歷史,包括每次修改的日期、修改者和修改內容簡述
*/
1.3 函式頭部應進行註釋,列出函式的功能、輸入引數、輸出引數、返回值、呼叫關係等。
/*
* Function: // 函式名稱
* Description: // 函式功能、效能等的描述
* Calls: // 被本函式呼叫的函式清單
* Called By: // 呼叫本函式的函式清單
* Input: // 輸入引數說明,包括每個引數的作用
* Output: // 輸出引數說明,有時透過指標引數返回一些變數值
* Return: // 函式返回值的說明
* Others: // 其他說明
*/
1.4 對於所有有特定含義的變數、常量、宏、結構體等資料結構,如果其命名不是充分自注釋的,在宣告時都必須加上註釋,說明其實際含義。變數、常量、宏的註釋應放在其上方或右方。
1.5 全域性變數要有較詳細的註釋,包括功能,取值範圍,哪些函式訪問它,訪問時的注意事項。
1.6 為使程式排版整齊,方便閱讀和理解,註釋也要進行縮排和對齊。
void example_function( void )
{
/* comments one */
unsigned int min_port, max_port;
/* comments two */
if ...
}
1.7 在複雜程式塊的結束行右方加註釋,以表明某程式塊的結束。
示例:
if (...)
{
...
while ( ... )
{
...
} /* while ( ... )迴圈語句結束*/
...
} /* end of if (...)語句結束 */
2 排版風格
2.1 相對獨立的程式塊之間、變數宣告之後必須加空行。
int conn_fd;
int ret;
conn_fd = socket(AF_INET, SOCK_STREAM,0);
if (conn_fd < 0) {
perror("socket create");
}
2.2 程式塊要採用縮排風格編寫,縮排為4個空格或一個Tab鍵。
2.3 對於較長的語句(超過個80字元)要分成多行書寫,劃分出的新行要進行適當的縮排,使排版整齊,語句可讀。對於引數較長的函式也要劃分成多行。
ret = connect(conn_fd, (struct sockaddr *)&serv_addr,
sizeof (struct sockaddr));
2.4 一行只寫一條語句,不允許把多個短語句寫在一行中。
以下語句是不規範的:
min_port = 1; max_port = 65535;
應該如下書寫:
min_port = 1;
max_port = 65535;
2.5 if、for、do、while、case、switch、default等語句各自佔一行,且if、for、do、while等語句的執行語句部分無論多少都要加括號{ }。
以下語句是不規範的:
if (conn_fd < 0) perror("socket create");
應該如下書寫:
if (conn_fd < 0) {
perror("socket create");
}
2.6 ‘{’ 和 ‘}’ 要獨佔一行
for (i=1; i<argc; i++)
{
...
}
或者在程式碼中‘{’與for語句同行,‘{’前面要有一個空格。
for (i=1; i<argc; i++) {
...
}
2.7 空格的使用
(1)以下語句在逗號後面加空格。
int min_port, max_port;
(2)"+"、"-"、"*"、"="等算術運算子兩邊都有一個空格。
a = i + j;
(3)"<"、">="等比較運算子兩邊都有一個空格。
if (conn_fd < 0) {
(4)"!"、"~"、"++"、"--"、"&"(地址運算子)等單目運算子前後不加空格。
i++;
(5)"->"、"."前後不加空格。
portinfo.min_port = i * seg_len + 1;
3 變數定義
3.1 變數命名要清晰明瞭,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解。
示例:
temp可以簡寫為tmp
message可以簡寫為msg
3.2 對於變數命名,禁止使用單個字元(如i、j、k),建議除了要有具體含義外,還能表明其資料型別等,但i、j、k作為區域性迴圈變數是允許的。
int iwidth; // i表明該變數為int型,width指明是寬度
3.3 在Linux下變數命名一般是全小寫加下劃線的風格。
一般使用:
int min_port;
一般不使用:
int minPort;
3.4 在多執行緒程式中使用全域性變數,應注意對變數操作的原子性。
3.5 應避免區域性變數與全域性變數同名。
3.6 嚴禁使用未經初始化的變數作為右值。在C程式中,引用未經賦值的指標,經常會引起程式崩潰。
以下程式碼在Linux下將導致錯誤,原因在於:沒有使p_string指向某個記憶體空間的情況下,即對其進行操作是錯誤的。
char *p_string;
p_sting[0] = ‘a’;
應先進行初始化:
char *p_string;
p_string = (char *)malloc(BUFF_SIZE); // 這裡假設BUFF_SIZE已定義
p_sting[0] = ‘a’;
4 宏定義
4.1 程式碼中儘量少使用字面常量,而使用宏常量。
4.2 宏定義時宏名儘量大寫
4.3 如果宏名由多個單片語成,那麼個單詞中間要加_
#define BUFF_SIZE 1024
input_data = (char *)malloc(BUFF_SIZE);
4.4 用宏定義表示式時,要使用完備的括號。
如下定義的宏存在一定的風險:
#define GET_AREA(a,b) a*b
應該定義為:
#define GET_AREA(a,b) ((a)*(b))
4.5 若宏中有多條語句,應該將這些語句放在一對大括號中。
下面語句中只有宏的第一條表示式被執行。
#define INTI_RECT_VALUE( a, b )\
a = 0;\
b = 0;
for (index = 0; index < RECT_TOTAL_NUM; index++)
INTI_RECT_VALUE( rect.a, rect.b );
正確的用法應為:
#define INTI_RECT_VALUE( a, b ) {\
a = 0;\
b = 0;\
}
for (index = 0; index < RECT_TOTAL_NUM; index++) {
INTI_RECT_VALUE( rect[index].a, rect[index].b );
}
5函式定義
5.1 一個函式完成一個特定的功能,不應嘗試在一個函式中實現多個不相關的功能。
5.2 檢查函式所有輸入引數的有效性,比如指標型引數要判斷是否為空,陣列成員引數判斷是否越界。
5.3 一個函式的規模應限制在200行以內(不包括空行和註釋行)。
5.4 函式的功能應該是可以預測的,也就是隻要輸入資料相同就應產生同樣的預期輸出。
5.5 函式的引數不宜過多,以1~3個為宜。
5.6 函式名應準確描述函式的功能,一般以動詞加賓語的形式命名。
void print_record( struct *p_record, int record_len) ;
5.7 函式的返回值要清楚、明瞭,讓使用者不容易忽視錯誤情況。函式的每種出錯返回值的意義要清晰、明確,防止使用者誤用,理解錯誤或忽視錯誤返回碼。
5.8 如果多段程式碼重複做同一件事情,那麼應該考慮把重複功能實現為一個函式。
5.9 減少函式本身或函式間的遞迴呼叫。
遞迴呼叫特別是函式間的遞迴呼叫(如A->B->C->A),影響程式的可理解性;遞迴呼叫一般都佔用較多的系統資源(如棧空間);遞迴呼叫對程式的測試不利。
6標頭檔案風格
6.1 標頭檔案可儲存如下內容:宏定義、型別定義、結構體定義、變數宣告、函式宣告
不要有如下內容:變數定義、函式定義
6.2 標頭檔案必須要有重複包含限制
#ifndef _ALPS_H
#define _ALPS_H
...
#endif
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912514/viewspace-2668244/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java語言編碼規範Java
- Uber Go 語言編碼規範Go
- Java語言編碼規範(Java Code Conventions)Java
- Java語言編碼規範(Java Code Conventions)【引用】blogjavaJava
- Java語言規範Java
- C語言與嵌入式C語言的區別C語言
- C語言程式設計規範——名稱縮寫C語言程式設計
- 程式碼規範之前端編寫碼規範前端
- html編碼規範HTML
- Pear 編碼規範
- CSS編碼規範CSS
- Javascript編碼規範JavaScript
- python編碼規範Python
- stylus編碼規範
- Go 語言程式碼風格規範-指南篇Go
- Go 語言程式碼風格規範-概述篇Go
- C語言程式設計,初學者必學程式碼規範,你知道哪些?C語言程式設計
- 常見編碼規範
- 前端安全編碼規範前端
- .Net編碼規範整理
- WEB前端編碼規範Web前端
- .Net Core 編碼規範
- Go 語言程式設計規範Go程式設計
- [C#] 程式碼規範C#
- 搜狐視訊iOS團隊 Objective-C 編碼規範iOSObject
- PHP編碼風格規範PHP
- HTML編碼規範建議HTML
- 前端開發編碼規範前端
- 09. C語言內嵌彙編程式碼C語言
- (嵌入式)Windows與Ubantu下的C語言程式的編譯執行WindowsC語言編譯
- c語言if語句是如何變成彙編程式碼的?C語言
- C語言 - 條件編譯C語言編譯
- 編寫shell指令碼的規範指令碼
- 前端設計與編碼規範前端
- PHP – 編碼規範 v1.0PHP
- Python基礎:編碼規範(4)Python
- 前端單體編碼規範整理前端
- 嵌入式C語言學習筆記2C語言筆記