免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
知名半導(dǎo)體MCU大廠(chǎng)軟件開(kāi)發(fā)C代碼規(guī)范

  大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家講的是飛思卡爾軟件開(kāi)發(fā)C語(yǔ)言編碼規(guī)范。

  2020鼠年春節(jié)是個(gè)漫長(zhǎng)的假期,痞子衡在家百無(wú)聊賴(lài),翻出了2016年10月1日(這個(gè)時(shí)間是痞子衡正式開(kāi)始用markdown+github寫(xiě)技術(shù)文章并發(fā)表到博客園上的紀(jì)念日)之前寫(xiě)的技術(shù)文檔,不翻不知道,一翻嚇一跳,從2007年上大學(xué)開(kāi)始到2016年這十年間,我真的寫(xiě)了非常多的技術(shù)類(lèi)文章,但都不夠完整,沒(méi)有成系統(tǒng),排版上也不優(yōu)雅,底下有時(shí)間我會(huì)慢慢整理出來(lái),不能讓以前的辛苦都被埋沒(méi)了。
  痞子衡2016年之前所寫(xiě)的那些技術(shù)文章除了原創(chuàng)外,也有一些是翻譯的,比如今天要分享的這篇就是2013年痞子衡剛?cè)肼氾w思卡爾半導(dǎo)體MCU軟件團(tuán)隊(duì)時(shí)為了學(xué)習(xí)C編碼規(guī)范所翻譯的(外企嘛,各種資料都是洋文),當(dāng)時(shí)飛思卡爾剛成立MCU軟件團(tuán)隊(duì)不久,那時(shí)候Kinetis SDK也還沒(méi)有正式推出,整個(gè)團(tuán)隊(duì)必須要有一個(gè)統(tǒng)一且良好的編碼風(fēng)格,這樣寫(xiě)出來(lái)的SDK才符合大廠(chǎng)身份。廢話(huà)不多說(shuō),下面是編碼規(guī)范原文:

1.引言

  制定此編碼風(fēng)格指導(dǎo)手冊(cè)的目的是為了使按此規(guī)范編寫(xiě)出的C/C++代碼極易被閱讀和理解。

2.與其他編碼風(fēng)格對(duì)比

3.基本排版格式

  • 需要以4個(gè)空格為單位的縮進(jìn).

  • 堅(jiān)決不用Tab鍵,要用空格鍵.

  • 所有文件結(jié)尾必須空一行.

  • 文本文件必須用UTF-8編碼.

  • 每一行不能超過(guò)100個(gè)字符.

4.文檔與注釋

  • 恰當(dāng)?shù)剡M(jìn)行代碼注釋.

  • 關(guān)于注釋長(zhǎng)度沒(méi)有具體限制,只要能提供幫助,就盡可能地注釋.

  • 注釋?xiě)?yīng)該解釋代碼為什么要這么做,而不是如何去做(代碼本身已經(jīng)表明了如何去做).

  • 選擇Doxygen文檔系統(tǒng)來(lái)完成注釋?zhuān)嗽诤瘮?shù)中的注釋之外(因?yàn)镈oxygen不適用于個(gè)別代碼行的注釋),Doxygen也不適用于匯編.

5.標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型

  • 僅使用C99標(biāo)準(zhǔn)給出的整型(定義見(jiàn)stdint.h文件),如uint32_t,int16_t等,不要typedef自己的整型類(lèi)型,如u8,int_32,WORD等.

  • 使用char 或wchar_t來(lái)表示字符串,但二進(jìn)制緩存仍應(yīng)使用uint8_t

  • 僅使用C99標(biāo)準(zhǔn)給出的bool型(定義見(jiàn)stdbool.h文件)來(lái)表示布爾變量,true和false表示其值. (ps: windows平臺(tái)下編譯時(shí)需自行定義,因?yàn)閣indows下不包含stdbool.h文件)

6.標(biāo)識(shí)符的命名

  以下是C/C++下變量、函數(shù)、typedef、宏命名的基本規(guī)則,命名規(guī)則可以接受細(xì)微改動(dòng),但要保證在同一模塊中的一致性:

  • 全局函數(shù)名:全小寫(xiě),單詞用下劃線(xiàn)隔開(kāi)
    如:i2c_receive_data()

  • 普通變量名:Camel命名法
    如:thisIsMyVariable

  • 結(jié)構(gòu)體名和類(lèi)名:Pascal命名法
    如:BigBoxOfTools

  • 類(lèi)成員函數(shù)名:Camel命名法
    如:initialLongProcess()

  • 用typedef重命名:全小寫(xiě),單詞用下劃線(xiàn)隔開(kāi),加_t后綴
    如:big_box_of_tools_t

  • 用宏命名:單詞全大寫(xiě)(僅在宏中使用,且必須使用)

  描述性強(qiáng)的,可讀性強(qiáng)的變量名非常重要:

  • 大部分單詞都不應(yīng)該縮寫(xiě),比如應(yīng)用block而不是blk,應(yīng)用count而不是cnt.
    一些流行的縮寫(xiě)還是允許的,如init或config

  • 完全可以接受較長(zhǎng)的,描述性的變量名

  • 布爾型變量可以使用”is”,”did”等前綴,這會(huì)清晰地表明其是一個(gè)布爾型

  • 變量名應(yīng)該可以表達(dá)其目的,但堅(jiān)決反對(duì)匈牙利命名(加數(shù)據(jù)類(lèi)型前綴)
    正確: temporaryParameters, startBlock, nodeKey, isAlarmEnabled
    錯(cuò)誤:u32BlkNum, bEnabled

  有時(shí)候?yàn)榱吮砻鞣秶湍康?,有些變量命名是可以加前綴和后綴的:

  • 局部變量:無(wú)需前綴

  • 全局變量:加g_前綴

  • 靜態(tài)變量:加s_前綴

  • 類(lèi)成員變量:加m_前綴

  • 常量:加k前綴
    1):如kUnconstrained, kFirstPage, kMaxBufferBytes
    2):k前綴使常量很容易被識(shí)別

  • typedef型變量:加_t后綴

  備注:切記不要用匈牙利命名法,因?yàn)槠鋾?huì)導(dǎo)致變量名難于閱讀,且類(lèi)型前綴常常會(huì)與變量真正類(lèi)型不同步,微軟曾是此命名法的擁躉,但其已意識(shí)到此命名法的缺陷,目前正在逐漸脫離此方法。

7.可調(diào)試性

  • 一系列的整型常量應(yīng)該用枚舉來(lái)表示,而不是用宏來(lái)定義
    1):在調(diào)試時(shí),常量被顯示為真實(shí)的標(biāo)識(shí),而不是數(shù)字
    2):便于常量的邏輯分組

  • 大部分情況下,使用內(nèi)聯(lián)函數(shù)來(lái)代替宏功能
    1):在調(diào)試中,內(nèi)聯(lián)函數(shù)可以被禁用,故可以跳過(guò)
    2):內(nèi)聯(lián)函數(shù)參數(shù)有類(lèi)型,而宏中參數(shù)不可以有類(lèi)型
    3):這個(gè)規(guī)則僅適用于當(dāng)用宏來(lái)表示一段代碼時(shí),不適用于在表達(dá)式中表示某部分的宏

8. C99標(biāo)準(zhǔn)

  • 需要使用C99
    C99被允許使能C++或C89語(yǔ)義內(nèi)聯(lián)

  • 在盡量靠近變量被使用的地方來(lái)聲明變量,而不是一律在函數(shù)頂部聲明
    1):這可以很容易地找到變量的定義
    2):可以方便編譯器進(jìn)行優(yōu)化

  • 單行注釋?xiě)?yīng)使用//而不是/* …*/
    1):大部分人認(rèn)為//式注釋方便閱讀
    2):免去注釋嵌套的煩惱

  • 多行注釋/* …*/可以被用作大段確定的內(nèi)容注釋?zhuān)拖馜oxygen注釋頭一樣,以使得被注釋的內(nèi)容突出。

9.內(nèi)聯(lián)功能

  頭文件中,內(nèi)聯(lián)功能啟用應(yīng)用static inline來(lái)完成

10. C/C++通用性

  頭文件中的公用函數(shù)原型必須包含在下列語(yǔ)句中

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

// 此處放函數(shù)原型

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

  C中一般都用typedef來(lái)重命名結(jié)構(gòu)體和枚舉數(shù)據(jù)類(lèi)型,不要提及原始的結(jié)構(gòu)體或枚舉型名
  C++中,則不需用typedef來(lái)重命名,直接用原始的結(jié)構(gòu)體或枚舉型名;但是如果代碼被C/C++共享,則應(yīng)遵從C風(fēng)格
  對(duì)于被用在C++中的函數(shù)(比如類(lèi)成員)而言,如果函數(shù)不帶任何參數(shù),則不需要一個(gè)專(zhuān)門(mén)的void參數(shù)來(lái)表明,而在C中這是需要的

11.花括號(hào)的使用

  花括號(hào)的使用雖重要性不高,但經(jīng)常起爭(zhēng)議

  • 通常情況下,花括號(hào)應(yīng)該單獨(dú)起一行,不需要額外的縮進(jìn)

  • 有時(shí)為了保持可讀性,可以不遵守上一規(guī)則

  • 花括號(hào)使用的關(guān)鍵點(diǎn)在于不要將代碼湊在一起,從而使得代碼比較難閱讀;也不要因?yàn)榫唧w格式的限定,從而打破視覺(jué)流程

  使用規(guī)則可以接受細(xì)微改動(dòng),但要保證在同一模塊中的一致性,以及易于閱讀

結(jié)構(gòu)體和類(lèi)示例:
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;
函數(shù)示例:
void foo()
{

printf('hi\n');
}
If語(yǔ)句示例:
if (baz >= kMaximumBaz)
{
baz = kMaximumBaz;
}
else if (!ready)
{
makeItReady();
}
else
{
abort();
}
For語(yǔ)句示例:
for (i=0; i < 10; ++i)
{
printf('%d', i);
}
While語(yǔ)句示例:
while (!done)
{
doSomething();
}
Do-while語(yǔ)句示例:
do {
doSomething();
} while (!done);
Switch語(yǔ)句示例:
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語(yǔ)句示例:
try
{
}
catch (std::exception & e)
{
}
catch (...)
{
}

12. 關(guān)于MISRA-C規(guī)范

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

  至此,飛思卡爾軟件開(kāi)發(fā)C語(yǔ)言編碼規(guī)范痞子衡便介紹完畢了,掌聲在哪里~~~

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
痞子衡嵌入式:MCUXpresso IDE下添加C++源文件進(jìn)SDK工程編譯的方法
C/C++代碼規(guī)范(1)
C++命名規(guī)則
嵌入式領(lǐng)域的葵花寶典
總結(jié)嵌入式系統(tǒng)基礎(chǔ)—下篇
單片機(jī)C51編程規(guī)范
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服