代碼爲什麼需要遵循規範,來看看µC/OS代碼規範

關注、星標公衆,不錯過精彩內容

素材來源:micrium

編輯整理:strongerHuang

開發過項目的工程師都知道,一個好的項目,代碼基本都有統一的規範,否則代碼就會隨着版本迭代,變得越來越臃腫。

代碼規範應在項目早期建立,這些規範對於保持整個項目的一致性非常有必要,採用一致的規範可以提高效率並簡化項目維護。

採用一致的規範可以:

  • 可移植性

  • 一致性

  • 整潔

  • 維修方便

  • 容易理解

  • 簡單


下面來看看著名的µC/OS代碼的規範。

一、標頭

C源文件的標頭如下所示,公司名稱和地址可以在前幾行,後跟一個標題,用於描述文件的內容。其中包含版權聲明,以警告該軟件的專有性等。

/*
************************************************************************************************
*                                          Company Name
*                                             Address
*
*                         (c) Copyright 19xx, Company Name, City, State
*                                       All Rights Reserved
*
*
* Filename     :
* Programmer(s):
* Description  :
************************************************************************************************
*/
/*$PAGE*/

二、包含文件

#include包含通常有兩種方式,在源文件中包含所需的頭文件,還有一種把所有頭文件都整理在一個文件,比如INCLUDES.H。這樣你就不必記住哪個頭文件與哪個源文件一起使用,尤其是在添加新模塊時。唯一的不便是編譯每個文件需要更長的時間。

/*
************************************************************************************************
*                                        INCLUDE FILES
************************************************************************************************
*/
#include "INCLUDES.H"
/*$PAGE*/

三、命名標識符

符合ANSI C標準的C編譯器(到目前爲止,大多數C編譯器都這樣做)最多允許32個字符作爲標識符名稱。標識符是變量、結構/聯合成員、函數、宏、#defines等。

比如:大寫字符用於分隔標識符中的單詞,功能和下劃線字符(_)類似。

static  INT16U KeyCharCnt;                  /* Number of keys pressed            */
static  char   KeyInBuf[100];               /* Storage buffer to hold chars      */
        char   KeyInChar;                   /* Character typed                   */


/*$PAGE*/

µC/OS命名標識符:

  • 函數聲明中的形式參數應僅包含小寫字符。

  • 自動變量名稱應僅包含小寫字符。

  • 靜態變量和函數應使用文件/模塊名稱(或其一部分)作爲前綴,並應使用大寫/小寫字符。

  • extern變量和函數應使用文件/模塊名稱(或其一部分)作爲前綴,並應使用大寫/小寫字符。

四、縮略

代碼基本都會使用縮寫,縮寫不能中英文混合,通常是英文的縮寫,比如OS代表Operating System。

一些常用的縮寫需要統一規範,一些不常用的縮寫需要在代碼中註釋清除。

µC/OS代碼中使用的縮寫比較多,比如:

縮寫
原意
AddrAddress
BlkBlock
ChkCheck
ClrClear
CntCount
CPUCentral Processing Unit
CtrCounter
CtxContext
CurCurrent
DelDelete
DlyDelay
ErrError

五、註釋

//  /* */ 是兩種最常見註釋的方法,還有註釋的位置也很關鍵。通常在代碼所在行上一行,或者在代碼所在行(代碼後面)。

但也有奇葩把代碼註釋在代碼所在行的下一行(通常不建議這麼操作)。

µC/OS使用 /**/ 而且都在代碼所在行(後面):

int atoi (char *s)
{
    int n;                                  /* Partial result of conversion                   */




    n = 0;                                  /* Initialize result                              */
    while (*s >= '0' && *s <= '9' && *s) {  /* For all valid characters and not end of string */
        n = 10 * n + *s - '0';              /* Convert char to int and add to partial result  */
        s++;                                /* Position on next character to convert          */
    }
    return (n);                             /* Return the result of the converted string      */
}

六、#defines

頭文件(.H)和C源文件(.C)可能需要定義常量和宏,常量和宏始終使用大寫字母。

#define  KEY_FF           0x0F
#define  KEY_CR           0x0D
#define  KEY_BUF_FULL()  (KeyNRd > 0)

七、數據類型

C語言允許你使用typedef關鍵字創建新的數據類型,µC/OS使用大寫字符聲明所有數據類型,因此遵循用於常量和宏的相同規則,永遠不會混淆常量,宏和數據類型的問題。

typedef  unsigned char  BOOLEAN;            /* Boolean               */
typedef  unsigned char  INT8U;              /*  8 bit unsigned       */
typedef  char           INT8S;              /*  8 bit signed         */
typedef  unsigned int   INT16U;             /* 16 bit unsigned       */
typedef  int            INT16S;             /* 16 bit signed         */
typedef  unsigned long  INT32U;             /* 32 bit unsigned       */
typedef  long           INT32S;             /* 32 bit signed         */
typedef  float          FP;                 /* Floating Point        */

八、局部變量

一些源模塊要求使用局部變量,通過使用static關鍵字,變量可以按字母順序或功能順序列出。

static  char    KeyBuf[100];
static  INT16S  KeyNRd;

九、縮進

縮進有使用空格和Tab兩種符號,規範通常只使用一種,不能空格和Tab兩種混合使用(現在很多編輯器都支持Tab替換成空格的功能)。

如果混合使用,在不同編輯器打開代碼,你就可能會看到一團糟。

µC/OS使用四個空格:

if (x < 0)
    z = 25;
if (y > 2) {
    z = 10;
    x = 100;
    p++;
}

十、結構體和聯合體

包含結構體和聯合體的格式、命名、註釋等這些都需要規範,µC/OS代碼使用的比較簡單,也是大衆化的定義:

typedef struct line {           /* Structure that defines a LINE                 */
     int  LineStartX;           /* 'X' & 'Y' starting coordinate                 */
     int  LineStartY;    
     int  LineEndX;             /* 'X' & 'Y' ending   coordinate                 */
     int  LineEndY;      
     int  LineColor;            /* Color of line to draw                         */
} LINE;
typedef struct point {          /* Structure that defines a POINT                */
    int  PointPosX;             /* 'X' & 'Y' coordinate of point                 */
    int  PointPosY;
    int  PointColor;            /* Color of point                                */
} POINT;

本文就寫到這裏,代碼規範建議參考一些大廠的規範手冊。當然,每家公司的代碼規範可能有所不同,只要寫代碼是時統一就行。

免責聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯繫刪除。

推薦閱讀:

在多任務(RTOS)環境中使用看門狗的重要性

Windows Terminal 1.0 和 Linux 版有啥區別

從大端CPU遷移到小端CPU,及字節序的遷移技術

關注微信公衆號『strongerHuang』,後臺回覆“1024”查看更多內容,回覆“加羣”按規則加入技術交流羣。

長按前往圖中包含的公衆號關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章