天天看點

c++ try catch語句_知名半導體MCU大廠軟體開發C代碼規範

  本文講解的是飛思卡爾軟體開發C語言編碼規範。來自于痞子衡嵌入式公衆号,下面是編碼規範原文:

1.引言

  制定此編碼風格指導手冊的目的是為了使按此規範編寫出的C/C++代碼極易被閱讀和了解。

2.與其他編碼風格對比

c++ try catch語句_知名半導體MCU大廠軟體開發C代碼規範

3.基本排版格式

  • 需要以4個空格為機關的縮進.
  • 堅決不用Tab鍵,要用空格鍵.
  • 所有檔案結尾必須空一行.
  • 文本檔案必須用UTF-8編碼.
  • 每一行不能超過100個字元.

4.文檔與注釋

  • 恰當地進行代碼注釋.
  • 關于注釋長度沒有具體限制,隻要能提供幫助,就盡可能地注釋.
  • 注釋應該解釋代碼為什麼要這麼做,而不是如何去做(代碼本身已經表明了如何去做).
  • 選擇Doxygen文檔系統來完成注釋,除了在函數中的注釋之外(因為Doxygen不适用于個别代碼行的注釋),Doxygen也不适用于彙編.

5.标準資料類型

  • 僅使用C99标準給出的整型(定義見stdint.h檔案),如uint32_t,int16_t等,不要typedef自己的整型類型,如u8,int_32,WORD等.
  • 使用char 或wchar_t來表示字元串,但二進制緩存仍應使用uint8_t
  • 僅使用C99标準給出的bool型(定義見stdbool.h檔案)來表示布爾變量,true和false表示其值. (ps: windows平台下編譯時需自行定義,因為windows下不包含stdbool.h檔案)

6.辨別符的命名

  以下是C/C++下變量、函數、typedef、宏命名的基本規則,命名規則可以接受細微改動,但要保證在同一子產品中的一緻性:

  • 全局函數名:全小寫,單詞用下劃線隔開如:i2c_receive_data()
  • 普通變量名:Camel命名法如:thisIsMyVariable
  • 結構體名和類名:Pascal命名法如:BigBoxOfTools
  • 類成員函數名:Camel命名法如:initialLongProcess()
  • 用typedef重命名:全小寫,單詞用下劃線隔開,加_t字尾如:big_box_of_tools_t
  • 用宏命名:單詞全大寫(僅在宏中使用,且必須使用)

  描述性強的,可讀性強的變量名非常重要:

  • 大部分單詞都不應該縮寫,比如應用block而不是blk,應用count而不是cnt.一些流行的縮寫還是允許的,如init或config
  • 完全可以接受較長的,描述性的變量名
  • 布爾型變量可以使用”is”,”did”等字首,這會清晰地表明其是一個布爾型
  • 變量名應該可以表達其目的,但堅決反對匈牙利命名(加資料類型字首)正确: temporaryParameters, startBlock, nodeKey, isAlarmEnabled錯誤:u32BlkNum, bEnabled

  有時候為了表明範圍和目的,有些變量命名是可以加字首和字尾的:

  • 局部變量:無需字首
  • 全局變量:加g_字首
  • 靜态變量:加s_字首
  • 類成員變量:加m_字首
  • 常量:加k字首1):如kUnconstrained, kFirstPage, kMaxBufferBytes2):k字首使常量很容易被識别
  • typedef型變量:加_t字尾

  備注:切記不要用匈牙利命名法,因為其會導緻變量名難于閱讀,且類型字首常常會與變量真正類型不同步,微軟曾是此命名法的擁趸,但其已意識到此命名法的缺陷,目前正在逐漸脫離此方法。

7.可調試性

  • 一系列的整型常量應該用枚舉來表示,而不是用宏來定義1):在調試時,常量被顯示為真實的辨別,而不是數字2):便于常量的邏輯分組
  • 大部分情況下,使用内聯函數來代替宏功能1):在調試中,内聯函數可以被禁用,故可以跳過2):内聯函數參數有類型,而宏中參數不可以有類型3):這個規則僅适用于當用宏來表示一段代碼時,不适用于在表達式中表示某部分的宏

8. C99标準

  • 需要使用C99C99被允許使能C++或C89語義内聯
  • 在盡量靠近變量被使用的地方來聲明變量,而不是一律在函數頂部聲明1):這可以很容易地找到變量的定義2):可以友善編譯器進行優化
  • 單行注釋應使用//而不是1):大部分人認為//式注釋友善閱讀2):免去注釋嵌套的煩惱
  • 多行注釋可以被用作大段确定的内容注釋,就像Doxygen注釋頭一樣,以使得被注釋的内容突出。

9.内聯功能

  頭檔案中,内聯功能啟用應用static inline來完成

10. C/C++通用性

  頭檔案中的公用函數原型必須包含在下列語句中

#if defined(__cplusplus)
extern "C" {
#endif // __cplusplus

// 此處放函數原型

#if defined(__cplusplus)
}
#endif // __cplusplus
           

  C中一般都用typedef來重命名結構體和枚舉資料類型,不要提及原始的結構體或枚舉型名

  C++中,則不需用typedef來重命名,直接用原始的結構體或枚舉型名;但是如果代碼被C/C++共享,則應遵從C風格

  對于被用在C++中的函數(比如類成員)而言,如果函數不帶任何參數,則不需要一個專門的void參數來表明,而在C中這是需要的

11.花括号的使用

  花括号的使用雖重要性不高,但經常起争議

  • 通常情況下,花括号應該單獨起一行,不需要額外的縮進
  • 有時為了保持可讀性,可以不遵守上一規則
  • 花括号使用的關鍵點在于不要将代碼湊在一起,進而使得代碼比較難閱讀;也不要因為具體格式的限定,進而打破視覺流程

  使用規則可以接受細微改動,但要保證在同一子產品中的一緻性,以及易于閱讀

結構體和類示例:struct Monkey
{
int x;
};

typedef struct MonkeyTwo {
int y;
} monkey_two_t;

class Cube
{
public:
    Cube(int theSize);

private:
int m_size;
};
枚舉示例:
enum _my_enum
{
    kValueOne = 1,
    kValueTwo = 2
};

typedef enum _another {
    kAnotherOne = 10,
    kAnotherTwo = 20
} another_t;
函數示例:
void foo(){
printf("hi\n");
}
If語句示例:
if (baz >= kMaximumBaz)
{
    baz = kMaximumBaz;
}
else if (!ready)
{
    makeItReady();
}
else
{
abort();
}
For語句示例:
for (i=0; i < 10; ++i)
{
printf("%d", i);
}
While語句示例:
while (!done)
{
    doSomething();
}
Do-while語句示例:
do {
    doSomething();
} while (!done);
Switch語句示例:
switch (value)
{
case 0:
        x += 1;
break;

case 1:
    {
int y;
        calculateIt(&y);
break;
    }

default:
return;
}
命名空間示例:
namespace fsl
{
// Don't indent namespace contents!
}
Try-catch語句示例:
try
{
}
catch (std::exception & e)
{
}
catch (...)
{
}
           

12. 關于MISRA-C規範

  代碼風格基本遵照MISRA-C:20xx規範,但除了以下例外(這些例外是基于MISRA-C:2004規範的)

c++ try catch語句_知名半導體MCU大廠軟體開發C代碼規範

  至此,飛思卡爾軟體開發C語言編碼規範痞子衡便介紹完畢了,掌聲在哪裡~~~

本文授權轉載自公衆号“痞子衡嵌入式”,作者痞子衡

繼續閱讀