日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式C編碼需要遵循的規(guī)范有哪些?

電子森林 ? 來(lái)源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2021-06-21 15:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1最重要的規(guī)則

編寫(xiě)代碼時(shí)最重要的一條規(guī)則是:檢查周?chē)拇a并嘗試模仿它。

作為維護(hù)人員,如果收到的補(bǔ)丁明顯與周?chē)a的編碼風(fēng)格不同,這是令人沮喪的。這是不尊重人的,就像某人穿著泥濘的鞋子走進(jìn)一間一塵不染的房子。

因此,無(wú)論本文推薦的是什么,如果已經(jīng)編寫(xiě)了代碼并且您正在對(duì)其進(jìn)行修補(bǔ),請(qǐng)保持其當(dāng)前的樣式一致,即使它不是您最喜歡的樣式。

2一般性的規(guī)則

這里列出了最明顯和最重要的一般規(guī)則。在你繼續(xù)閱讀其他章節(jié)之前,請(qǐng)仔細(xì)檢查它們。

使用C99標(biāo)準(zhǔn)

不使用制表符,而是使用空格

每個(gè)縮進(jìn)級(jí)別使用4個(gè)空格

在關(guān)鍵字和左括號(hào)之間使用一個(gè)空格

在函數(shù)名和左括號(hào)之間不要使用空格

int32_ta=sum(4,3);/*OK*/ int32_ta=sum(4,3);/*Wrong*/

不要在變量/函數(shù)/宏/類(lèi)型中使用_或前綴。這是為C語(yǔ)言本身保留的

對(duì)于嚴(yán)格的模塊私有函數(shù),使用prv_name前綴

對(duì)于包含下劃線(xiàn)_char的變量/函數(shù)/宏/類(lèi)型,只能使用小寫(xiě)字母

左花括號(hào)總是與關(guān)鍵字(for,while,do,switch,if,…)在同一行

size_ti; for(i=0;i

在比較操作符和賦值操作符之前和之后使用單個(gè)空格

int32_ta; a=3+4;/*OK*/ for(a=0;a

每個(gè)逗號(hào)后用單空格

func_name(5,4);/*OK*/ func_name(4,3);/*Wrong*/

不要初始化靜態(tài)和全局變量為0(或NULL),讓編譯器為您做

staticint32_ta;/*OK*/ staticint32_tb=4;/*OK*/ staticint32_ta=0;/*Wrong*/ voidmy_func(void){ staticint32_t*ptr;/*OK*/ staticcharabc=0;/*Wrong*/ }

在同一行中聲明所有相同類(lèi)型的局部變量

voidmy_func(void){ chara;/*OK*/ charb;/*Wrong,variablewithchartypealreadyexists*/ chara,b;/*OK*/ }

按順序聲明局部變量

i. 自定義結(jié)構(gòu)和枚舉

ii. 整數(shù)類(lèi)型,更寬的無(wú)符號(hào)類(lèi)型優(yōu)先

iii. 單/雙浮點(diǎn)

intmy_func(void){ /*1*/ my_struct_tmy;/*Firstcustomstructures*/ my_struct_ptr_t*p;/*Pointerstoo*/ /*2*/ uint32_ta; int32_tb; uint16_tc; int16_tg; charh; /*...*/ /*3*/ doubled; floatf; }

總是在塊的開(kāi)頭聲明局部變量,在第一個(gè)可執(zhí)行語(yǔ)句之前

在for循環(huán)中聲明計(jì)數(shù)器變量

/*OK*/ for(size_ti=0;i

避免在聲明中使用函數(shù)調(diào)用來(lái)賦值變量,除了單個(gè)變量

voida(void){ /*Avoidfunctioncallswhendeclaringvariable*/ int32_ta,b=sum(1,2); /*Usethis*/ int32_ta,b; b=sum(1,2); /*Thisisok*/ uint8_ta=3,b=4; }

除了char、float或double之外,始終使用stdint.h標(biāo)準(zhǔn)庫(kù)中聲明的類(lèi)型。例如,8位的uint8_t等

不要使用stdbool.h庫(kù)。分別使用1或0表示真或假

/*OK*/ uint8_tstatus; status=0; /*Wrong*/ #include boolstatus=true;

永遠(yuǎn)不要與真實(shí)相比較。例如,使用if(check_func()){…}替換if (check_func() * 1)

總是將指針與空值進(jìn)行比較

void*ptr; /*...*/ /*OK,compareagainstNULL*/ if(ptr*NULL||ptr!=NULL){ } /*Wrong*/ if(ptr||!ptr){ }

總是使用前增量(和遞減),而不是后增量(和遞減)

int32_ta=0; ... a++;/*Wrong*/ ++a;/*OK*/ for(size_tj=0;j

總是使用size_t作為長(zhǎng)度或大小變量

如果函數(shù)不應(yīng)該修改指針?biāo)赶虻膬?nèi)存,則總是使用const作為指針

如果不應(yīng)該修改函數(shù)的形參或變量,則總是使用const

/*Whendcouldbemodified,datapointedtobydcouldnotbemodified*/ void my_func(constvoid*d){ } /*Whendanddatapointedtobydbothcouldnotbemodified*/ void my_func(constvoid*constd){ } /*Notrequired,itisadvised*/ void my_func(constsize_tlen){ } /*Whendshouldnotbemodifiedinsidefunction,onlydatapointedtobydcouldbemodified*/ void my_func(void*constd){ }

當(dāng)函數(shù)可以接受任何類(lèi)型的指針時(shí),總是使用void*,不要使用uint8_t*。函數(shù)在實(shí)現(xiàn)時(shí)必須注意正確的類(lèi)型轉(zhuǎn)換

/* *Tosenddata,functionshouldnotmodifymemorypointedtoby`data`variable *thus`const`keywordisimportant * *Tosendgenericdata(ortowritethemtofile) *anytypemaybepassedfordata, *thususe`void*` */ /*OKexample*/ voidsend_data(constvoid*data,size_tlen){/*OK*/ /*Donotcast`void*`or`constvoid*`*/ constuint8_t*d=data;/*Functionhandlespropertypeforinternalusage*/ } voidsend_data(constvoid*data,intlen){/*Wrong,notnotuseint*/ }

總是使用括號(hào)和sizeof操作符

不要使用變長(zhǎng)數(shù)組。使用動(dòng)態(tài)內(nèi)存分配代替標(biāo)準(zhǔn)Cmalloc和自由函數(shù),或者如果庫(kù)/項(xiàng)目提供了自定義內(nèi)存分配,使用它的實(shí)現(xiàn)看看LwMEM,一個(gè)自定義內(nèi)存管理庫(kù)。

/*OK*/ #include void my_func(size_tsize){ int32_t*arr; arr=malloc(sizeof(*arr)*n);/*OK,Allocatememory*/ arr=malloc(sizeof*arr*n);/*Wrong,bracketsforsizeofoperatoraremissing*/ if(arr*NULL){ /*FAIL,nomemory*/ } free(arr);/*Freememoryafterusage*/ } /*Wrong*/ void my_func(size_tsize){ int32_tarr[size];/*Wrong,donotuseVLA*/ }

總是將variable與0進(jìn)行比較,除非它被視為布爾類(lèi)型

永遠(yuǎn)不要將布爾處理的變量與0或1進(jìn)行比較。用NOT(!)代替

size_tlength=5;/*Countervariable*/ uint8_tis_ok=0;/*Boolean-treatedvariable*/ if(length)/*Wrong,lengthisnottreatedasboolean*/ if(length>0)/*OK,lengthistreatedascountervariablecontainingmultivalues,notonly0or1*/ if(length*0)/*OK,lengthistreatedascountervariablecontainingmultivalues,notonly0or1*/ if(is_ok)/*OK,variableistreatedasboolean*/ if(!is_ok)/*OK,-||-*/ if(is_ok*1)/*Wrong,nevercomparebooleanvariableagainst1!*/ if(is_ok*0)/*Wrong,use!fornegativecheck*/

對(duì)于注釋?zhuān)偸鞘褂?*comment */,即使是單行注釋

在頭文件中總是包含帶有extern關(guān)鍵字的c++檢查

每個(gè)函數(shù)都必須包含doxygen-enabled注釋?zhuān)词购瘮?shù)是靜態(tài)的

使用英文名稱(chēng)/文本的函數(shù),變量,注釋

變量使用小寫(xiě)字母

如果變量包含多個(gè)名稱(chēng),請(qǐng)使用下劃線(xiàn)。force_redraw。不要使用forceRedraw

對(duì)于C標(biāo)準(zhǔn)庫(kù)的包含文件,請(qǐng)始終使用<和>。例如,#include

對(duì)于自定義庫(kù),請(qǐng)始終使用""。例如,#include“my_library.h”

當(dāng)轉(zhuǎn)換為指針類(lèi)型時(shí),總是將星號(hào)與類(lèi)型對(duì)齊,例如。uint8_t* t = (uint8_t*)var_width_diff_type

始終尊重項(xiàng)目或庫(kù)中已經(jīng)使用的代碼風(fēng)格

3注釋相關(guān)的規(guī)則

不允許以//開(kāi)頭的注釋??偸鞘褂芒?comment */,即使是單行注釋

對(duì)于多行注釋?zhuān)啃惺褂每崭?星號(hào)

/* *Thisismulti-linecomments, *writtenin2lines(ok) */ /** *Wrong,usedouble-asteriskonlyfordoxygendocumentation */ /* *Singlelinecommentwithoutspacebeforeasterisk(wrong) */ /* *Singlelinecommentinmulti-lineconfiguration(wrong) */ /*Singlelinecomment(ok)*/

注釋時(shí)使用12個(gè)縮進(jìn)(12 * 4個(gè)空格)偏移量。如果語(yǔ)句大于12個(gè)縮進(jìn),將注釋4-空格對(duì)齊(下面的例子)到下一個(gè)可用縮進(jìn)

voidmy_func(void){ chara,b; a=call_func_returning_char_a(a);/*Thisiscommentwith12*4spacesindentfrombeginningofline*/ b=call_func_returning_char_a_but_func_name_is_very_long(a);/*Thisiscomment,alignedto4-spacesindent*/ }

04函數(shù)定義的規(guī)則

每個(gè)可以從模塊外部訪(fǎng)問(wèn)的函數(shù)都必須包含函數(shù)原型(或聲明)

函數(shù)名必須小寫(xiě),可以用下劃線(xiàn)_分隔。(這個(gè)原則好像因人而異)

/*OK*/ voidmy_func(void); voidmyfunc(void); /*Wrong*/ voidMYFunc(void); voidmyFunc();

當(dāng)函數(shù)返回指針時(shí),將星號(hào)對(duì)齊到返回類(lèi)型

/*OK*/ constchar*my_func(void); my_struct_t*my_func(int32_ta,int32_tb); /*Wrong*/ constchar*my_func(void); my_struct_t*my_func(void);

對(duì)齊所有的功能原型(使用相同/相似的功能)以提高可讀性

/*OK,functionnamesaligned*/ voidset(int32_ta); my_type_tget(void); my_ptr_t*get_ptr(void); /*Wrong*/ voidset(int32_ta); constchar*get(void);

函數(shù)實(shí)現(xiàn)必須在單獨(dú)的行中包含返回類(lèi)型和可選的其他關(guān)鍵字

/*OK*/ int32_t foo(void){ return0; } /*OK*/ staticconstchar* get_string(void){ return"Helloworld! "; } /*Wrong*/ int32_tfoo(void){ return0; }

5變量相關(guān)的規(guī)則

使變量名全部小寫(xiě),下劃線(xiàn)_字符可選

/*OK*/ int32_ta; int32_tmy_var; int32_tmyvar; /*Wrong*/ int32_tA; int32_tmyVar; int32_tMYVar;

按類(lèi)型將局部變量分組在一起

voidfoo(void){ int32_ta,b;/*OK*/ chara; charb;/*Wrong,chartypealreadyexists*/ }

不要在第一個(gè)可執(zhí)行語(yǔ)句之后聲明變量

voidfoo(void){ int32_ta; a=bar(); int32_tb;/*Wrong,thereisalreadyexecutablestatement*/ }

你可以在下一個(gè)縮進(jìn)級(jí)別中聲明新的變量

int32_ta,b; a=foo(); if(a){ int32_tc,d;/*OK,canddareinif-statementscope*/ c=foo(); int32_te;/*Wrong,therewasalreadyexecutablestatementinsideblock*/ }

用星號(hào)聲明指針變量與類(lèi)型對(duì)齊

/*OK*/ char*a; /*Wrong*/ char*a; char*a;

當(dāng)聲明多個(gè)指針變量時(shí),可以使用星號(hào)對(duì)變量名進(jìn)行聲明

/*OK*/ char*p,*n;

6結(jié)構(gòu)、枚舉類(lèi)型定義

結(jié)構(gòu)名或枚舉名必須小寫(xiě),單詞之間有下劃線(xiàn)_字符

結(jié)構(gòu)或枚舉可以包含typedef關(guān)鍵字

所有結(jié)構(gòu)成員都必須小寫(xiě)

所有枚舉成員必須是大寫(xiě)的

結(jié)構(gòu)/枚舉必須遵循doxygen文檔語(yǔ)法

在聲明結(jié)構(gòu)體時(shí),它可以使用以下三種不同的選項(xiàng)之一:

1. 當(dāng)結(jié)構(gòu)體僅用名稱(chēng)聲明時(shí),它的名稱(chēng)后不能包含_t后綴。

structstruct_name{ char*a; charb; };

2. 當(dāng)只使用typedef聲明結(jié)構(gòu)時(shí),它的名稱(chēng)后面必須包含_t后綴。

typedefstruct{ char*a; charb; }struct_name_t;

3. 當(dāng)結(jié)構(gòu)用name和typedef聲明時(shí),它不能包含t作為基本名稱(chēng),它必須在它的名稱(chēng)后面包含t后綴作為typedef部分。

typedefstructstruct_name{ char*a; charb; charc; }struct_name_t;

錯(cuò)誤聲明的例子及其建議的糾正:

/*aandbmustbeseparatedto2lines*/ /*Nameofstructurewithtypedefmustinclude_tsuffix*/ typedefstruct{ int32_ta,b; }a; /*Correctedversion*/ typedefstruct{ int32_ta; int32_tb; }a_t; /*Wrongname,itmustnotinclude_tsuffix*/ structname_t{ int32_ta; int32_tb; }; /*Wrongparameters,mustbealluppercase*/ typedefenum{ MY_ENUM_TESTA, my_enum_testb, }my_enum_t;

在聲明時(shí)初始化結(jié)構(gòu)時(shí),使用C99初始化風(fēng)格

/*OK*/ a_ta={ .a=4, .b=5, }; /*Wrong*/ a_ta={1,2};

當(dāng)為函數(shù)句柄引入newtypedef時(shí),使用_fn后綴

/*Functionaccepts2parametersandreturnsuint8_t*/ /*Nameoftypedefhas`_fn`suffix*/ typedefuint8_t(*my_func_typedef_fn)(uint8_tp1,constchar*p2);

07復(fù)合語(yǔ)句規(guī)則

每個(gè)復(fù)合語(yǔ)句必須包括左花括號(hào)和右花括號(hào),即使它只包含1個(gè)嵌套語(yǔ)句

每個(gè)復(fù)合語(yǔ)句必須包含單個(gè)縮進(jìn);嵌套語(yǔ)句時(shí),每個(gè)嵌套包含1個(gè)縮進(jìn)大小

/*OK*/ if(c){ do_a(); }else{ do_b(); } /*Wrong*/ if(c) do_a(); else do_b(); /*Wrong*/ if(c)do_a(); elsedo_b();

在if或if-else-if語(yǔ)句的情況下,else必須與第一條語(yǔ)句的右括號(hào)在同一行

/*OK*/ if(a){ }elseif(b){ }else{ } /*Wrong*/ if(a){ } else{ } /*Wrong*/ if(a){ } else { }

在do-while語(yǔ)句的情況下,while部分必須與do部分的右括號(hào)在同一行

/*OK*/ do{ int32_ta; a=do_a(); do_b(a); }while(check()); /*Wrong*/ do { /*...*/ }while(check()); /*Wrong*/ do{ /*...*/ } while(check());

每一個(gè)開(kāi)括號(hào)都需要縮進(jìn)

if(a){ do_a(); }else{ do_b(); if(c){ do_c(); } }

不要做沒(méi)有花括號(hào)的復(fù)合語(yǔ)句,即使是單個(gè)語(yǔ)句。下面的例子展示了一些不好的做法

if(a)do_b(); elsedo_c(); if(a)do_a();elsedo_b();

空while循環(huán)、do-while循環(huán)或for循環(huán)必須包含花括號(hào)

/*OK*/ while(is_register_bit_set()){} /*Wrong*/ while(is_register_bit_set()); while(is_register_bit_set()){} while(is_register_bit_set()){ }

如果while(或for、do-while等)為空(嵌入式編程中也可能是這種情況),請(qǐng)使用空的單行括號(hào)

/*Waitforbittobesetinembeddedhardwareunit uint32_t*addr=HW_PERIPH_REGISTER_ADDR; /*Waitbit13tobeready*/ while(*addr&(1<

盡量避免在循環(huán)塊內(nèi)遞增變量,參見(jiàn)示例

/*Notrecommended*/ int32_ta=0; while(a

8分支語(yǔ)句規(guī)則

為每個(gè)case語(yǔ)句添加單個(gè)縮進(jìn)

使用額外的單縮進(jìn)break語(yǔ)句在每個(gè)case或default

/*OK,everycasehassingleindent*/ /*OK,everybreakhasadditionalindent*/ switch(check()){ case0: do_a(); break; case1: do_b(); break; default: break; } /*Wrong,caseindentmissing*/ switch(check()){ case0: do_a(); break; case1: do_b(); break; default: break; } /*Wrong*/ switch(check()){ case0: do_a(); break;/*Wrong,breakmusthaveindentasitisundercase*/ case1: do_b();/*Wrong,indentundercaseismissing*/ break; default: break; }

總是包含default語(yǔ)句

/*OK*/ switch(var){ case0: do_job(); break; default:break; } /*Wrong,defaultismissing*/ switch(var){ case0: do_job(); break; }

如果需要局部變量,則使用花括號(hào)并在里面放入break語(yǔ)句。將左花括號(hào)放在case語(yǔ)句的同一行

switch(a){ /*OK*/ case0:{ int32_ta,b; charc; a=5; /*...*/ break; } /*Wrong*/ case1: { int32_ta; break; } /*Wrong,breakshallbeinside*/ case2:{ int32_ta; } break; }

9 宏和預(yù)處理指令

總是使用宏而不是文字常量,特別是對(duì)于數(shù)字

所有的宏必須是全大寫(xiě)的,并帶有下劃線(xiàn)_字符(可選),除非它們被明確標(biāo)記為function,將來(lái)可能會(huì)被常規(guī)函數(shù)語(yǔ)法替換

/*OK*/ #defineMY_MACRO(x)((x)*(x)) /*Wrong*/ #definesquare(x)((x)*(x))

總是用圓括號(hào)保護(hù)輸入?yún)?shù)

/*OK*/ #defineMIN(x,y)((x)

總是用括號(hào)保護(hù)最終的宏計(jì)算

/*Wrong*/ #defineMIN(x,y)(x)

當(dāng)宏使用多個(gè)語(yǔ)句時(shí),使用do-while(0)語(yǔ)句保護(hù)它

typedefstruct{ int32_tpx,py; }point_t; point_tp;/*Definenewpoint*/ /*Wrongimplementation*/ /*Definemacrotosetpoint*/ #defineSET_POINT(p,x,y)(p)->px=(x);(p)->py=(y)/*2statements.Lastoneshouldnotimplementsemicolon*/ SET_POINT(&p,3,4);/*Setpointtoposition3,4.Thisevaluatesto...*/ (&p)->px=(3);(&p)->py=(4);/*...tothis.Inthisexamplethisisnotaproblem.*/ /*Considerthisuglycode,howeveritisvalidbyCstandard(notrecommended)*/ if(a)/*Ifaistrue*/ if(b)/*Ifbistrue*/ SET_POINT(&p,3,4);/*Setpointtox=3,y=4*/ else SET_POINT(&p,5,6);/*Setpointtox=5,y=6*/ /*Evaluatestocodebelow.Doyouseetheproblem?*/ if(a) if(b) (&p)->px=(3);(&p)->py=(4); else (&p)->px=(5);(&p)->py=(6); /*Orifwerewriteitalittle*/ if(a) if(b) (&p)->px=(3); (&p)->py=(4); else (&p)->px=(5); (&p)->py=(6); /* *Askyourselfaquestion:Towhich`if`statement`else`keywordbelongs? * *Basedonfirstpartofcode,answerisstraight-forward.Toinner`if`statementwhenwecheck`b`condition *Actualanswer:Compilationerroras`else`belongsnowhere */ /*Betterandcorrectimplementationofmacro*/ #defineSET_POINT(p,x,y)do{(p)->px=(x);(p)->py=(y);}while(0)/*2statements.Nosemicolonafterwhileloop*/ /*Orevenbetter*/ #defineSET_POINT(p,x,y)do{/*Backslashindicatesstatementcontinuesinnewline*/ (p)->px=(x); (p)->py=(y); }while(0)/*2statements.Nosemicolonafterwhileloop*/ /*Noworiginalcodeevaluatesto*/ if(a) if(b) do{(&p)->px=(3);(&p)->py=(4);}while(0); else do{(&p)->px=(5);(&p)->py=(6);}while(0); /*Everypartof`if`or`else`containsonly`1`innerstatement(do-while),hencethisisvalidevaluation*/ /*Tomakecodeperfect,usebracketsforeveryif-ifelse-elsestatements*/ if(a){/*Ifaistrue*/ if(b){/*Ifbistrue*/ SET_POINT(&p,3,4);/*Setpointtox=3,y=4*/ }else{ SET_POINT(&p,5,6);/*Setpointtox=5,y=6*/ } }

不縮進(jìn)子語(yǔ)句內(nèi)#if語(yǔ)句

/*OK*/ #ifdefined(XYZ) #ifdefined(ABC) /*dowhenABCdefined*/ #endif/*defined(ABC)*/ #else/*defined(XYZ)*/ /*DowhenXYZnotdefined*/ #endif/*!defined(XYZ)*/ /*Wrong*/ #ifdefined(XYZ) #ifdefined(ABC) /*dowhenABCdefined*/ #endif/*defined(ABC)*/ #else/*defined(XYZ)*/ /*DowhenXYZnotdefined*/ #endif/*!defined(XYZ)*/ 文檔

文檔化的代碼允許doxygen解析和通用的html/pdf/latex輸出,因此正確地執(zhí)行是非常重要的。

對(duì)變量、函數(shù)和結(jié)構(gòu)/枚舉使用doxygen支持的文檔樣式

經(jīng)常使用作為doxygen,不要使用@

始終使用5x4空格(5個(gè)制表符)作為文本行開(kāi)始的偏移量

/** *riefHoldspointertofirstentryinlinkedlist *Beginningofthistextis5tabs(20spaces)frombeginningofline */ static type_t*list;

每個(gè)結(jié)構(gòu)/枚舉成員都必須包含文檔

注釋的開(kāi)頭使用12x4空格偏移量

/** *riefThisispointstruct * oteThisstructureisusedtocalculateallpoint *relatedstuff */ typedefstruct{ int32_tx;/*!

函數(shù)的文檔必須在函數(shù)實(shí)現(xiàn)中編寫(xiě)(通常是源文件)

函數(shù)必須包括簡(jiǎn)要和所有參數(shù)文檔

如果每個(gè)參數(shù)分別為in或out輸入和輸出,則必須注意

如果函數(shù)返回某個(gè)值,則必須包含返回形參。這不適用于void函數(shù)

函數(shù)可以包含其他doxygen關(guān)鍵字,如note或warning

在參數(shù)名和描述之間使用冒號(hào):

/** *riefSum`2`numbers *param[in]a:Firstnumber *param[in]b:Secondnumber *returnSumofinputvalues */ int32_t sum(int32_ta,int32_tb){ returna+b; } /** *riefSum`2`numbersandwriteittopointer * oteThisfunctiondoesnotreturnvalue,itstoresittopointerinstead *param[in]a:Firstnumber *param[in]b:Secondnumber *param[out]result:Outputvariableusedtosaveresult */ void void_sum(int32_ta,int32_tb,int32_t*result){ *result=a+b; }

如果函數(shù)返回枚舉的成員,則使用ref關(guān)鍵字指定哪個(gè)成員

/** *riefMyenumeration */ typedefenum{ MY_ERR,/*!

對(duì)常量或數(shù)字使用符號(hào)(' NULL ' => NULL)

/** *riefGetdatafrominputarray *param[in]in:Inputdata *returnPointertooutputdataonsuccess,`NULL`otherwise */ constvoid* get_data(constvoid*in){ returnin; }

宏的文檔必須包括hideinitializer doxygen命令

/** *riefGetminimalvaluebetween`x`and`y` *param[in]x:Firstvalue *param[in]y:Secondvalue *returnMinimalvaluebetween`x`and`y` *hideinitializer */ #defineMIN(x,y)((x)

10頭/源文件

在文件末尾留下一個(gè)空行

每個(gè)文件都必須包括文件的doxygen注釋和后跟空行的簡(jiǎn)要描述(使用doxygen時(shí))

/** *filetemplate.h *riefTemplateincludefile */ /*Hereisemptyline*/

每個(gè)文件(頭文件或源文件)必須包含許可證(開(kāi)始注釋包括單個(gè)星號(hào),因?yàn)閐oxygen必須忽略這個(gè))

使用與項(xiàng)目/庫(kù)已經(jīng)使用的相同的許可證

/** *filetemplate.h *riefTemplateincludefile */ /* *Copyright(c)yearFirstNameLASTNAME * *Permissionisherebygranted,freeofcharge,toanyperson *obtainingacopyofthissoftwareandassociateddocumentation *files(the"Software"),todealintheSoftwarewithoutrestriction, *includingwithoutlimitationtherightstouse,copy,modify,merge, *publish,distribute,sublicense,and/orsellcopiesoftheSoftware, *andtopermitpersonstowhomtheSoftwareisfurnishedtodoso, *subjecttothefollowingconditions: * *Theabovecopyrightnoticeandthispermissionnoticeshallbe *includedinallcopiesorsubstantialportionsoftheSoftware. * *THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND, *EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIES *OFMERCHANTABILITY,FITNESSFORAPARTICULARPURPOSE *ANDNONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHT *HOLDERSBELIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY, *WHETHERINANACTIONOFCONTRACT,TORTOROTHERWISE,ARISING *FROM,OUTOFORINCONNECTIONWITHTHESOFTWAREORTHEUSEOR *OTHERDEALINGSINTHESOFTWARE. * *Thisfileispartoflibrary_name. * *Author:FirstNameLASTNAME */@example.com>

頭文件必須包含保護(hù)符#ifndef

頭文件必須包含c++檢查

在c++檢查之外包含外部頭文件

首先用STLC文件包含外部頭文件,然后是應(yīng)用程序自定義文件

頭文件必須包含其他所有頭文件,以便正確編譯,但不能包含更多頭文件(如果需要,.c應(yīng)該包含其余的頭文件)

頭文件必須只公開(kāi)模塊公共變量/類(lèi)型/函數(shù)

在頭文件中使用extern作為全局模塊變量,稍后在源文件中定義它們

/*file.h...*/ #ifndef... externint32_tmy_variable;/*Thisisglobalvariabledeclarationinheader*/ #endif /*file.c...*/ int32_tmy_variable;/*Actuallydefinedinsource*/

不要把.c文件包含在另一個(gè).c文件中

.c文件應(yīng)該首先包含相應(yīng)的.h文件,然后是其他文件,除非另有明確的必要

在頭文件中不包含模塊私有聲明

頭文件示例(示例中沒(méi)有l(wèi)icense)

/*Licensecomeshere*/ #ifndefTEMPLATE_HDR_H #defineTEMPLATE_HDR_H /*Includeheaders*/ #ifdef__cplusplus extern"C"{ #endif/*__cplusplus*/ /*Filecontenthere*/ #ifdef__cplusplus } #endif/*__cplusplus*/ #endif/*TEMPLATE_HDR_H*/

責(zé)任編輯:lq6

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5210

    文章

    20680

    瀏覽量

    337362
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67869
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74417

原文標(biāo)題:嵌入式C編碼規(guī)范

文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    低代碼可視化,破解嵌入式開(kāi)發(fā)高門(mén)檻難題

    在工業(yè)控制、智能硬件、物聯(lián)網(wǎng)快速發(fā)展的今天,嵌入式開(kāi)發(fā)作為核心支撐技術(shù),其高門(mén)檻卻成為行業(yè)發(fā)展的絆腳石。專(zhuān)業(yè)編碼要求高、新人上手慢、項(xiàng)目迭代滯后等問(wèn)題,制約著人才儲(chǔ)備與技術(shù)普及
    的頭像 發(fā)表于 03-25 14:13 ?234次閱讀
    低代碼可視化,破解<b class='flag-5'>嵌入式</b>開(kāi)發(fā)高門(mén)檻難題

    嵌入式驅(qū)動(dòng)開(kāi)發(fā),需要掌握哪些技能?

    經(jīng)驗(yàn)的老司機(jī)都知道,做嵌入式驅(qū)動(dòng)開(kāi)發(fā)需要掌握一系列的技能,包含編程、硬件、操作系統(tǒng)、調(diào)試等多個(gè)方面。 1、硬件知識(shí)熟悉原理圖:能看懂原理圖以及各種元器件的含義,以及PCB布局等。 了解
    發(fā)表于 01-20 16:46

    什么是嵌入式應(yīng)用開(kāi)發(fā)?

    系統(tǒng)中,用于控制、監(jiān)測(cè)或通信等特定用途。與一般計(jì)算機(jī)系統(tǒng)不同,嵌入式系統(tǒng)通常具有較小的存儲(chǔ)容量、處理能力和功耗,且需要滿(mǎn)足特定的實(shí)時(shí)性、可靠性和安全性要求?。 應(yīng)用領(lǐng)域 嵌入式系統(tǒng)廣泛應(yīng)用于各種設(shè)備
    發(fā)表于 01-12 16:13

    arm嵌入式主板優(yōu)缺點(diǎn)

    嵌入式主板是嵌入在設(shè)備里面做控制、數(shù)據(jù)處理使用的CPU板 ,常見(jiàn)的兩類(lèi),即基于X86的嵌入式主板和基于RISC的ARM 嵌入式主板。今天我
    發(fā)表于 01-08 07:08

    系統(tǒng)嵌入式的學(xué)習(xí)路線(xiàn)

    的知識(shí)太多,太雜,太廣,很多嵌入式初學(xué)者陷入嵌入式知識(shí)的海洋中,東學(xué)一點(diǎn),西學(xué)一點(diǎn),找不到學(xué)習(xí)的方向。 我從事嵌入式開(kāi)發(fā)工作10年,嵌入式
    發(fā)表于 12-16 07:49

    C語(yǔ)言在嵌入式開(kāi)發(fā)中的應(yīng)用

    C 語(yǔ)言在汽車(chē)電子控制系統(tǒng)開(kāi)發(fā)中的主導(dǎo)地位。 2、設(shè)備驅(qū)動(dòng)程序 設(shè)備驅(qū)動(dòng)程序是嵌入式系統(tǒng)中連接硬件和軟件的橋梁,它負(fù)責(zé)實(shí)現(xiàn)嵌入式系統(tǒng)與外部設(shè)備之間的通信和控制。C 語(yǔ)言由于其對(duì)底
    發(fā)表于 11-21 08:09

    嵌入式與FPGA的區(qū)別

    ,一是嵌入式軟件開(kāi)發(fā),主要與嵌入式cao作系統(tǒng)、應(yīng)用軟件等有關(guān)。第二是嵌入式硬件開(kāi)發(fā),需要掌握硬件設(shè)計(jì)、模擬仿真、 PCB設(shè)計(jì)等技能。 ?2、FPGA:它是在PAL、GAL、CPLD等
    發(fā)表于 11-20 07:12

    嵌入式和FPGA的區(qū)別

    的典范,由大量可編程邏輯塊和可編程互連資源組成,所有邏輯單元可以同時(shí)工作,特別適合需要高并行度的應(yīng)用場(chǎng)景。 開(kāi)發(fā)流程對(duì)比 嵌入式開(kāi)發(fā)通常使用C/C++等高級(jí)語(yǔ)言,開(kāi)發(fā)工具鏈成熟,調(diào)
    發(fā)表于 11-19 06:55

    2025年最佳的嵌入式編程語(yǔ)言哪些呢?

    嵌入式系統(tǒng)是現(xiàn)代科技不可或缺的一部分。它們存在于家用電器、汽車(chē)、住宅、醫(yī)院、商店等各個(gè)領(lǐng)域。它們與我們的社會(huì)緊密相連。選擇合適的語(yǔ)言來(lái)構(gòu)建嵌入式系統(tǒng)對(duì)于成功至關(guān)重要。那么,2025年最佳的嵌入式編程
    的頭像 發(fā)表于 11-14 10:27 ?1810次閱讀
    2025年最佳的<b class='flag-5'>嵌入式</b>編程語(yǔ)言<b class='flag-5'>有</b>哪些呢?

    C語(yǔ)言是否會(huì)阻礙嵌入式的發(fā)展?

    門(mén)老朋友:C語(yǔ)言。電子工業(yè)已經(jīng)走過(guò)了50多年,而C語(yǔ)言仍然是超過(guò)六成嵌入式項(xiàng)目的首選。它驅(qū)動(dòng)著全球數(shù)以?xún)|計(jì),甚至以萬(wàn)億計(jì)的設(shè)備。但它的統(tǒng)治地位也引發(fā)了一個(gè)問(wèn)題:C
    的頭像 發(fā)表于 11-14 10:27 ?563次閱讀
    <b class='flag-5'>C</b>語(yǔ)言是否會(huì)阻礙<b class='flag-5'>嵌入式</b>的發(fā)展?

    嵌入式需要掌握哪些核心技能?

    嵌入式需要掌握哪些核心技能? 若想通過(guò)學(xué)習(xí)嵌入式技術(shù)提升就業(yè)競(jìng)爭(zhēng)力,需重點(diǎn)掌握C語(yǔ)言、嵌入式硬件架構(gòu)、RTOS/Linux開(kāi)發(fā)、通信協(xié)議四
    發(fā)表于 10-21 16:25

    嵌入式達(dá)到什么水平才能就業(yè)?

    很多想入行嵌入式的朋友,都在糾結(jié):自己得學(xué)到啥水平,才能找到工作?要是現(xiàn)在還沒(méi)達(dá)到這種水平/剛想入行嵌入式,現(xiàn)在開(kāi)始學(xué)還來(lái)得及嘛?別慌,今天就來(lái)好好聊聊~ 嵌入式就業(yè),需要達(dá)到這些水
    發(fā)表于 09-15 10:20

    盤(pán)點(diǎn)嵌入式就業(yè)所需要的技能有哪些?

    ,把握未來(lái)的職業(yè)機(jī)遇。 1.智能汽車(chē)行業(yè): - 熟悉嵌入式編程語(yǔ)言,如C/C++、Python等。 - 掌握嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)流程,了解汽車(chē)電子控制系統(tǒng)的基本原理。 - 具備良好的
    發(fā)表于 08-11 15:43

    入行嵌入式應(yīng)該怎么準(zhǔn)備?

    是至關(guān)重要的,因此,掌握C/C++編程技巧是入行嵌入式的基礎(chǔ)。 二、硬件基礎(chǔ)知識(shí)了解基本的電子電路和數(shù)字邏輯是嵌入式系統(tǒng)開(kāi)發(fā)的基礎(chǔ)。你需要
    發(fā)表于 08-06 10:34

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    : 單片機(jī)嵌入式 :開(kāi)發(fā)環(huán)境相對(duì)簡(jiǎn)單,通常使用C語(yǔ)言或匯編語(yǔ)言進(jìn)行編程,開(kāi)發(fā)工具包括Keil、IAR等。 Linux嵌入式 :開(kāi)發(fā)環(huán)境較為復(fù)雜,除了需要掌握
    發(fā)表于 06-20 09:46
    西畴县| 红河县| 德化县| 紫阳县| 台安县| 安陆市| 红原县| 墨玉县| 河北省| 溆浦县| 平山县| 彭水| 积石山| 文成县| 东阿县| 永平县| 建阳市| 南平市| 潮州市| 丽水市| 延吉市| 大丰市| 黔东| 正安县| 天门市| 黄浦区| 古浪县| 临汾市| 革吉县| 崇州市| 米林县| 崇礼县| 南川市| 库车县| 萨迦县| 五莲县| 晴隆县| 内江市| 兴安盟| 阜阳市| 新平|