RM新时代网站-首页

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

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

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

嵌入式系統(tǒng)中C語言的編寫規(guī)范

嵌入式開發(fā)星球 ? 來源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2024-05-11 08:49 ? 次閱讀

最重要的一條規(guī)則

編寫代碼時最重要的一條規(guī)則是:檢查周圍的代碼并嘗試模仿它。

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

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

一般規(guī)則

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

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

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

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

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

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

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

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

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

對于包含下劃線_ char的變量/函數(shù)/宏/類型,只能使用小寫字母

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

size_ti;for(i=0;i
  • 在比較操作符和賦值操作符之前和之后使用單個空格
int32_ta;a=3+4;/*OK*/for(a=0;a
  • 每個逗號后用單空格
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*/}
  • 在同一行中聲明所有相同類型的局部變量
voidmy_func(void){chara;/*OK*/charb;/*Wrong,variablewithchartypealreadyexists*/chara,b;/*OK*/}
  • 按順序聲明局部變量

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

ii.整數(shù)類型,更寬的無符號類型優(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;}
  • 總是在塊的開頭聲明局部變量,在第一個可執(zhí)行語句之前
  • 在for循環(huán)中聲明計數(shù)器變量
/*OK*/for(size_ti=0;i
  • 避免在聲明中使用函數(shù)調(diào)用來賦值變量,除了單個變量
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)庫中聲明的類型。例如,8位的uint8_t等

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

/*OK*/uint8_tstatus;status=0;/*Wrong*/#includeboolstatus=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作為長度或大小變量

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

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

/*Whendcouldbemodified,datapointedtobydcouldnotbemodified*/voidmy_func(constvoid*d){}/*Whendanddatapointedtobydbothcouldnotbemodified*/voidmy_func(constvoid*constd){}/*Notrequired,itisadvised*/voidmy_func(constsize_tlen){}/*Whendshouldnotbemodifiedinsidefunction,onlydatapointedtobydcouldbemodified*/voidmy_func(void*constd){}
  • 當(dāng)函數(shù)可以接受任何類型的指針時,總是使用void *,不要使用uint8_t *。函數(shù)在實(shí)現(xiàn)時必須注意正確的類型轉(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*/}

總是使用括號和sizeof操作符

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

看看LwMEM,一個自定義內(nèi)存管理庫。

/*OK*/#includevoidmy_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*/voidmy_func(size_tsize){int32_tarr[size];/*Wrong,donotuseVLA*/}

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

永遠(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*/
  • 對于注釋,總是使用/* comment */,即使是單行注釋

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

每個函數(shù)都必須包含doxygen-enabled注釋,即使函數(shù)是靜態(tài)的

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

變量使用小寫字母

如果變量包含多個名稱,請使用下劃線。force_redraw。不要使用forceRedraw

對于C標(biāo)準(zhǔn)庫的包含文件,請始終使用<和>。例如,# include < stdlib.h >

對于自定義庫,請始終使用""。例如,# include“my_library.h”

當(dāng)轉(zhuǎn)換為指針類型時,總是將星號與類型對齊,例如。uint8_t* t = (uint8_t*)var_width_diff_type

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

注釋

  • 不允許以//開頭的注釋??偸鞘褂?* comment */,即使是單行注釋
//Thisiscomment(wrong)/*Thisiscomment(ok)*/
  • 對于多行注釋,每行使用空格+星號
/**Thisismulti-linecomments,*writtenin2lines(ok)*//***Wrong,usedouble-asteriskonlyfordoxygendocumentation*//**Singlelinecommentwithoutspacebeforeasterisk(wrong)*//**Singlelinecommentinmulti-lineconfiguration(wrong)*//*Singlelinecomment(ok)*/
  • 注釋時使用12個縮進(jìn)(12 * 4個空格)偏移量。如果語句大于12個縮進(jìn),將注釋4-空格對齊(下面的例子)到下一個可用縮進(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*/}

函數(shù)

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

函數(shù)名必須小寫,可以用下劃線_分隔

/*OK*/voidmy_func(void);voidmyfunc(void);/*Wrong*/voidMYFunc(void);voidmyFunc();
  • 當(dāng)函數(shù)返回指針時,將星號對齊到返回類型
/*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);
  • 對齊所有的功能原型(使用相同/相似的功能)以提高可讀性
/*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ú)的行中包含返回類型和可選的其他關(guān)鍵字
/*OK*/int32_tfoo(void){return0;}/*OK*/staticconstchar*get_string(void){return"Helloworld!rn";}/*Wrong*/int32_tfoo(void){return0;}

變量

  • 使變量名全部小寫,下劃線_字符可選
/*OK*/int32_ta;int32_tmy_var;int32_tmyvar;/*Wrong*/int32_tA;int32_tmyVar;int32_tMYVar;
  • 按類型將局部變量分組在一起
voidfoo(void){int32_ta,b;/*OK*/chara;charb;/*Wrong,chartypealreadyexists*/}
  • 不要在第一個可執(zhí)行語句之后聲明變量
voidfoo(void){int32_ta;a=bar();int32_tb;/*Wrong,thereisalreadyexecutablestatement*/}
  • 你可以在下一個縮進(jìn)級別中聲明新的變量
int32_ta,b;a=foo();if(a){int32_tc,d;/*OK,canddareinif-statementscope*/c=foo();int32_te;/*Wrong,therewasalreadyexecutablestatementinsideblock*/}
  • 用星號聲明指針變量與類型對齊
/*OK*/char*a;/*Wrong*/char*a;char*a;
  • 當(dāng)聲明多個指針變量時,可以使用星號對變量名進(jìn)行聲明
/*OK*/char*p,*n;

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

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

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

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

所有枚舉成員必須是大寫的

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

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

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

structstruct_name{char*a;charb;};

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

typedefstruct{char*a;charb;}struct_name_t;

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

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

錯誤聲明的例子及其建議的糾正:

/*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;
  • 在聲明時初始化結(jié)構(gòu)時,使用C99初始化風(fēng)格
/*OK*/a_ta={.a=4,.b=5,};/*Wrong*/a_ta={1,2};
  • 當(dāng)為函數(shù)句柄引入new typedef時,使用_fn后綴
/*Functionaccepts2parametersandreturnsuint8_t*//*Nameoftypedefhas`_fn`suffix*/typedefuint8_t(*my_func_typedef_fn)(uint8_tp1,constchar*p2);

復(fù)合語句

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

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

/*OK*/if(c){do_a();}else{do_b();}/*Wrong*/if(c)do_a();elsedo_b();/*Wrong*/if(c)do_a();elsedo_b();
  • 在if或if-else-if語句的情況下,else必須與第一條語句的右括號在同一行
/*OK*/if(a){}elseif(b){}else{}/*Wrong*/if(a){}else{}/*Wrong*/if(a){}else{}
  • 在do-while語句的情況下,while部分必須與do部分的右括號在同一行
/*OK*/do{int32_ta;a=do_a();do_b(a);}while(check());/*Wrong*/do{/*...*/}while(check());/*Wrong*/do{/*...*/}while(check());
  • 每一個開括號都需要縮進(jìn)
if(a){do_a();}else{do_b();if(c){do_c();}}
  • 不要做沒有花括號的復(fù)合語句,即使是單個語句。下面的例子展示了一些不好的做法
if(a)do_b();elsedo_c();if(a)do_a();elsedo_b();
  • 空while循環(huán)、do-while循環(huán)或for循環(huán)必須包含花括號
/*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等)為空(嵌入式編程中也可能是這種情況),請使用空的單行括號
/*Waitforbittobesetinembeddedhardwareunituint32_t*addr=HW_PERIPH_REGISTER_ADDR;/*Waitbit13tobeready*/while(*addr&(1
  • 盡量避免在循環(huán)塊內(nèi)遞增變量,參見示例
/*Notrecommended*/int32_ta=0;while(a

分支語句

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

使用額外的單縮進(jìn)break語句在每個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語句
/*OK*/switch(var){case0:do_job();break;default:break;}/*Wrong,defaultismissing*/switch(var){case0:do_job();break;}
  • 如果需要局部變量,則使用花括號并在里面放入break語句。將左花括號放在case語句的同一行
switch(a){/*OK*/case0:{int32_ta,b;charc;a=5;/*...*/break;}/*Wrong*/case1:{int32_ta;break;}/*Wrong,breakshallbeinside*/case2:{int32_ta;}break;}

宏和預(yù)處理指令

  • 總是使用宏而不是文字常量,特別是對于數(shù)字
  • 所有的宏必須是全大寫的,并帶有下劃線_字符(可選),除非它們被明確標(biāo)記為function,將來可能會被常規(guī)函數(shù)語法替換
/*OK*/#defineMY_MACRO(x)((x)*(x))/*Wrong*/#definesquare(x)((x)*(x))
/*OK*/#defineMIN(x,y)((x)
  • 總是用括號保護(hù)最終的宏計算
/*Wrong*/#defineMIN(x,y)(x)
  • 當(dāng)宏使用多個語句時,使用do-while(0)語句保護(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*/elseSET_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);elsedo{(&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)子語句內(nèi)#if語句
/*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í)行是非常重要的。

  • 對變量、函數(shù)和結(jié)構(gòu)/枚舉使用doxygen支持的文檔樣式
  • 經(jīng)常使用作為doxygen,不要使用@
  • 始終使用5x4空格(5個制表符)作為文本行開始的偏移量
/***briefHoldspointertofirstentryinlinkedlist*Beginningofthistextis5tabs(20spaces)frombeginningofline*/statictype_t*list;
  • 每個結(jié)構(gòu)/枚舉成員都必須包含文檔
  • 注釋的開頭使用12x4空格偏移量
/***briefThisispointstruct*noteThisstructureisusedtocalculateallpoint*relatedstuff*/typedefstruct{int32_tx;/*!

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

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

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

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

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

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

/***briefSum`2`numbers*param[in]a:Firstnumber*param[in]b:Secondnumber*returnSumofinputvalues*/int32_tsum(int32_ta,int32_tb){returna+b;}/***briefSum`2`numbersandwriteittopointer*noteThisfunctiondoesnotreturnvalue,itstoresittopointerinstead*param[in]a:Firstnumber*param[in]b:Secondnumber*param[out]result:Outputvariableusedtosaveresult*/voidvoid_sum(int32_ta,int32_tb,int32_t*result){*result=a+b;}
  • 如果函數(shù)返回枚舉的成員,則使用ref關(guān)鍵字指定哪個成員
/***briefMyenumeration*/typedefenum{MY_ERR,/*!
  • 對常量或數(shù)字使用符號(' NULL ' => NULL)
/***briefGetdatafrominputarray*param[in]in:Inputdata*returnPointertooutputdataonsuccess,`NULL`otherwise*/constvoid*get_data(constvoid*in){returnin;}
  • 宏的文檔必須包括hideinitializer doxygen命令
/***briefGetminimalvaluebetween`x`and`y`*param[in]x:Firstvalue*param[in]y:Secondvalue*returnMinimalvaluebetween`x`and`y`*hideinitializer*/#defineMIN(x,y)((x)

頭/源文件

在文件末尾留下一個空行

每個文件都必須包括文件的doxygen注釋和后跟空行的簡要描述(使用doxygen時)

/***filetemplate.h*briefTemplateincludefile*//*Hereisemptyline*/

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

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

/***filetemplate.h*briefTemplateincludefile*//**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*/

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

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

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

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

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

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

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

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

不要把.c文件包含在另一個.c文件中

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

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

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

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


審核編輯 黃宇

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

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304778
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136680
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47183

    瀏覽量

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

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68518
收藏 人收藏

    評論

    相關(guān)推薦

    基于ARM的嵌入式系統(tǒng)C語言編程的結(jié)合

    嵌入式平臺上進(jìn)行C語言編寫系統(tǒng)軟件和應(yīng)用軟件的方法,希望為軟件編程人員提供一些思考。隨著計算機(jī)技術(shù)尤其是計算機(jī)信息控制技術(shù)的深入發(fā)展,
    發(fā)表于 12-14 08:49

    標(biāo)準(zhǔn)C語言嵌入式C語言有哪些區(qū)別

    世界使用最廣泛的系統(tǒng)編程語言。嵌入式CC的擴(kuò)展,在嵌入式
    發(fā)表于 12-14 06:15

    怎么樣用C語言編寫嵌入式系統(tǒng)的死循環(huán)呢

    怎么樣用C語言編寫嵌入式系統(tǒng)的死循環(huán)呢?關(guān)鍵字volatile有什么含義嗎?
    發(fā)表于 12-24 07:46

    嵌入式C語言進(jìn)階之道

    的。問題是,若是我不愿意只是當(dāng)一個小菜鳥,我想對嵌入式 C 語言有 更多更深的了解時,我突然發(fā)現(xiàn),滿圖書館的書,竟找不到一本,能解我心頭之惑。 對于在實(shí)際工作當(dāng)中, 你不再是獨(dú)自編寫
    發(fā)表于 04-19 10:15

    ARM嵌入式系統(tǒng)C語言編程

    無操作系統(tǒng)支持的嵌入式系統(tǒng)軟件,包括系統(tǒng)引導(dǎo)(BOOT) 、驅(qū)動程序、動態(tài)內(nèi)存管理、IPO、通信以及應(yīng)用軟件等方面。本文詳細(xì)介紹了嵌入式平臺
    發(fā)表于 11-07 15:55 ?165次下載

    嵌入式c語言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語言編程的各項(xiàng)知識,包括嵌入式c語言編程,
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語言</b>編程(由淺入深)

    嵌入式底層開發(fā)為什么選擇C語言

    嵌入式底層開發(fā)為什么選擇C語言嵌入式系統(tǒng)編寫語言
    發(fā)表于 10-20 13:35 ?2次下載
    <b class='flag-5'>嵌入式</b>底層開發(fā)為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>

    標(biāo)準(zhǔn)c語言嵌入式,嵌入式C語言C語言的區(qū)別

    嵌入式C語言C語言的區(qū)別:最常用的系統(tǒng)編程語言
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區(qū)別

    嵌入式軟件之c語言編碼規(guī)范

    嵌入式軟件之c語言編碼規(guī)范
    發(fā)表于 10-28 18:13 ?28次下載

    嵌入式為什么選擇C語言作為開發(fā)語言

    C語言作為開發(fā)語言呢?一起了解一下。首先來說這應(yīng)該是必然的吧,嵌入式開發(fā)是在操作系統(tǒng)內(nèi)部做開發(fā)的,而操作
    發(fā)表于 11-03 14:06 ?15次下載
    <b class='flag-5'>嵌入式</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>作為開發(fā)<b class='flag-5'>語言</b>?

    嵌入式C語言知識總結(jié)

    1 嵌入式C語言總結(jié)從語法上來說C語言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>知識總結(jié)

    嵌入式開發(fā)為什么選擇C語言?它有哪些特點(diǎn)?

    ,操作系統(tǒng)嵌入式開發(fā)的核心,操作系統(tǒng)的內(nèi)核和驅(qū)動都是C語言編寫的。在這之前小編先給大家介紹一下
    的頭像 發(fā)表于 01-04 09:56 ?1217次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)<b class='flag-5'>中</b>為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>?它有哪些特點(diǎn)?

    嵌入式系統(tǒng)C語言

    電子發(fā)燒友網(wǎng)站提供《嵌入式系統(tǒng)C語言.doc》資料免費(fèi)下載
    發(fā)表于 11-18 14:39 ?2次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>C</b><b class='flag-5'>語言</b>

    嵌入式C語言的結(jié)構(gòu)特點(diǎn)

    嵌入式開發(fā)既有底層硬件的開發(fā)又涉及上層應(yīng)用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語言既具有匯編語言
    的頭像 發(fā)表于 11-24 16:16 ?670次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的結(jié)構(gòu)特點(diǎn)

    嵌入式系統(tǒng)C語言編寫規(guī)范

    如果變量包含多個名稱,請使用下劃線。force_redraw。不要使用forceRedraw 對于C標(biāo)準(zhǔn)庫的包含文件,請始終使用。例如,# include < stdlib.h >
    發(fā)表于 03-15 09:55 ?981次閱讀
    RM新时代网站-首页