版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)最后說一個必需用到的快捷鍵:Ctrl+s保存,一定要形成習(xí)慣,寫完一段就保存.代碼風(fēng)格是一個很個性化的東西,每個人都會有自己的喜好和見解。這里列出的是我個人的風(fēng)格,并且是一般的代碼風(fēng)格。所謂一般是指文中沒有對標(biāo)識符的命名有太多的規(guī)定,如全局變量、局部變量、宏等。相關(guān)規(guī)則一般在具體的項目中給出,不同的項目可以有不同的命名規(guī)則。屏幕空間:這里基于標(biāo)準(zhǔn)的UNIX終端(Terminal)來定義屏幕的大小,寬度為80個字符,高度為24或25行。1縮進(jìn)1.1基本規(guī)則使用8字符寬度的tab來控制縮進(jìn)。除了注釋,空格從來不用于縮進(jìn);相應(yīng)的,tab只用于縮進(jìn),不用于其他場合。縮進(jìn)(indentation)的目的是為了清楚的表現(xiàn)一個邏輯塊的開始和結(jié)束,使用8字符這樣的大縮進(jìn)可以表現(xiàn)得更明顯。關(guān)于縮進(jìn)的風(fēng)格有很多,其中反對tab的不在少數(shù)。反對的理由之一是tab在不同的系統(tǒng)和編輯器上可能有不同的定義,從而導(dǎo)致本來很規(guī)整的代碼在別的系統(tǒng)上顯示錯位。這確實(shí)是一個問題,所以,開始之前,請確認(rèn)使用的編輯器將tab設(shè)置等于8字符寬度。反對使用8字符tab的另一理由是,當(dāng)縮進(jìn)層次太多時,代碼向屏幕右側(cè)跑得太快,導(dǎo)致跨行代碼增多,難于閱讀。確實(shí),在一些復(fù)雜的商業(yè)邏輯中,縮進(jìn)層次可能很多。對此這里引用LinuxKernel代碼風(fēng)格中的一個解釋:如果你的代碼有超過3層的縮進(jìn),那么你需要重新設(shè)計你的程序。要做到這點(diǎn)不容易,尤其當(dāng)程序員水平有限,或者項目緊急,沒有時間來優(yōu)化代碼。此時使用別的縮進(jìn)方案(如4空格縮進(jìn))可能是一個折中的方案。1.2基本形式以if語句為例:
if(mapping)
spin_lock(&mapping->i_shared_lock);不要寫在一行上:
if(mapping)spin_lock(&mapping->i_shared_lock);類型定義:structnlmsgerr{
interror;
structnlmsghdrmsg;};1.3switch語句switch語句稍微有點(diǎn)例外,每個case標(biāo)號與switch關(guān)鍵字在同一個縮進(jìn)層次:
switch(behavior){
caseMADV_SEQUENTIAL:
vma->vm_flags|=VM_SEQ_READ;
break;
caseMADV_RANDOM:
vma->vm_flags|=VM_RAND_READ;
break;
default:
break;
}2空格2.1關(guān)鍵字在多數(shù)情況下,關(guān)鍵字后面用一個空格來與其他代碼分開,比如if、switch、case、for、do、while等。
for(i=0;i<smp_num_cpus;i++)
while(!cachep->growing)
do{
...
}while(sizes->cs_size);sizeof和defined例外,在sizeof和defined后面使用小括號,不使用空格,雖然C語法并沒有如此強(qiáng)制規(guī)定。如:
base=sizeof(slab_t);#ifdefined(CONFIG_SMP)2.2括號函數(shù)名和括號之間沒有空格。在小括號與內(nèi)部的表達(dá)式之間也沒有空格。如:
memset(addr,POISON_BYTE,size);而不是:
memset(addr,POISON_BYTE,size);該規(guī)則同樣適用于中括號,以及用于初始化列表的大括號。如:
charbuf[20+40];
cpucache_t*new[NR_CPUS];
structswap_list_tswap_list={-1,-1};當(dāng)括號中的內(nèi)容為空時,左右括號之間也沒有空格。如:staticconstcharbad_file[]="Badswapfileentry";2.3指針當(dāng)聲明指針類型的數(shù)據(jù)和返回指針類型的函數(shù)時,星號(*)與數(shù)據(jù)名和函數(shù)名相連,而不是與類型名相連。如:
slab_t*slabp;staticvoid*s_next(structseq_file*m,void*p,loff_t*pos)2.4二元運(yùn)算符在二元運(yùn)算符,諸如=+-<>*/%|&^<=>===!=等的兩邊各用一個空格:
slabp=objp+colour_off;
objp-=BYTES_PER_WORD;
if(cachep->colour_next>=cachep->colour)
if((flags&SLAB_POISON)&&ctor)2.5三元運(yùn)算符三元運(yùn)算符?:因形式的特殊性,總共用到4個空格(?和:兩邊各一個):
(gfpflags&GFP_DMA)?p->cs_dmacachep:p->cs_cachep;2.6一元運(yùn)算符在一元運(yùn)算符,諸如&*+-~!sizeofdefined等的后面不加空格:
address&=~PGDIR_MASK;
if(!offset)statickmem_cache_t*clock_searchp=&cache_cache;在后綴形式的++和--前不加空格:
pte++;
count--;在前綴形式的++和--后不加空格:
++pte;
--count;在結(jié)構(gòu)運(yùn)算符.和->的兩邊不加空格:
area->flags=flags;
spin_lock(&init_mm.page_table_lock);2.7強(qiáng)制轉(zhuǎn)換在強(qiáng)制轉(zhuǎn)換后面不加空格:
area->addr=(void*)addr;2.8分號和逗號分號(;)與前面的代碼之間不加空格。當(dāng)分號用于for語句頭部時,與后面的代碼(右括號除外)之間加一個空格。
for(p=&vmlist;(tmp=*p);p=&tmp->next)當(dāng)for用于永真循環(huán)時,則沒有空格:
for(;;)逗號(,)規(guī)則與上類似。當(dāng)一個初始化列表以逗號結(jié)束時,逗號與右大括號之間可以有一個空格:intacct_parm[]={4,2,30,};在每行的末尾不要遺留多余的空白字符。如($表示行的結(jié)束):
if(niceval<-20)$而不是:
if(niceval<-20)
$2.9對齊在多行變量定義的地方,在類型與變量名之間可以適當(dāng)?shù)脑黾涌崭駚韺R(注意不能用tab,tab只用于縮進(jìn)!):
int
size;
fd_set*new_fdset;該規(guī)則也適用于其他一些類似的場合,如宏定義:#defineSTATS_INC_FREEHIT(x)
do{}while(0)#defineSTATS_INC_FREEMISS(x)do{}while(0)3大括號的位置3.1語句塊這里采用Kernighan和Ritchie的風(fēng)格(K&R):左括號({)在行的末尾,與前面代碼之間有一個空格;右括號(})則單獨(dú)成行,并與對應(yīng)的塊起始行對齊。即:
while(--n){
p=p->next;
if(p==&cache_cache.next)
returnNULL;
}注意右括號是單獨(dú)成行,除非后面還有子句,如do-while、if-else等。此時在右括號和后面的關(guān)鍵字之間加一個空格。形式如下:
do{
...
}while(--i);
if(end==area->vm_end){
...
}elseif(addr==area->vm_start){
...
}else{
...
}注意以上多路if-else的縮進(jìn)格式,不要寫成下面的形式:
if(end==area->vm_end){
...
}elseif(addr==area->vm_start){
...
}else{
...
}該規(guī)則對所有語句塊(除了函數(shù))都適用,包括if、switch、for、while、do等。這樣做的理由是可以大幅度減少括號單獨(dú)形成的行的的數(shù)目,從而在屏幕(比如24行的終端)中可以容納下更多的代碼,同時不損失代碼的可讀性。3.2函數(shù)定義對于函數(shù)定義,左括號和右括號都單獨(dú)成行:voidlock_vma_mappings(structvm_area_struct*vma){
structaddress_space*mapping;
mapping=NULL;
if(vma->vm_file)
mapping=vma->vm_file->d_inode->i_mapping;
if(mapping)
spin_lock(&mapping->i_shared_lock);}4長行代碼每行代碼的長度原則上不能超過屏幕寬度,即80個字符。超過80個字符的行應(yīng)分成多行書寫,后續(xù)行的長度不大于前面行的長度,并縮進(jìn)放置在右側(cè)。這規(guī)則也適用于長參數(shù)列表的函數(shù)和長字符串。如:
printk(KERN_WARNING"Warningthisisalongprintkwith"
"3parametersa:%ub:%u"
"c:%u\n",a,b,c);當(dāng)函數(shù)參數(shù)太多時,出于可讀性和維護(hù)性的考慮,也可采用如下方式:
if(msq!=NULL){
len+=sprintf(buffer+len,"%10d%10d%4o%10lu%10lu%5u%5u%5u%5u%5u%5u%10lu%10lu%10lu\n",
msq->q_perm.key,
msg_buildid(i,msq->q_perm.seq),
msq->q_perm.mode,
msq->q_cbytes,
msq->q_qnum,
msq->q_lspid,
msq->q_lrpid,
msq->q_perm.uid,
msq->q_perm.gid,
msq->q_perm.cuid,
msq->q_perm.cgid,
msq->q_stime,
msq->q_rtime,
msq->q_ctime);對于長字符串,如果覺得以上規(guī)則妨礙了字符串格式的控制,那么也可以超過80字符,如上例,但這樣的情形不應(yīng)該出現(xiàn)太多。5注釋采用“/*...*/”方式注釋,不允許嵌套,也不允許C99風(fēng)格注釋“//...”。多行注釋的格式:/**Thisisthepreferredstyleformulti-line*commentsintheLinuxkernelsourcecode.*Pleaseuseitconsistently.**Description:
Acolumnofasterisksontheleftside,*withbeginningandendingalmost-blanklines.*/6函數(shù)6.1定義多個函數(shù)定義之間用一個空行分隔:voidlock_vma_mappings(structvm_area_struct*vma){
structaddress_space*mapping;
mapping=NULL;
if(vma->vm_file)
mapping=vma->vm_file->d_inode->i_mapping;
if(mapping)
spin_lock(&mapping->i_shared_lock);}voidunlock_vma_mappings(structvm_area_struct*vma){
structaddress_space*mapping;
mapping=NULL;
if(vma->vm_file)
mapping=vma->vm_file->d_inode->i_mapping;
if(mapping)
spin_unlock(&mapping->i_shared_lock);}推薦將函數(shù)返回類型與函數(shù)名分成兩行,使函數(shù)名頂頭書寫:staticvoidremove_shared_vm_struct(structvm_area_struct*vma){
lock_vma_mappings(vma);
__remove_shared_vm_struct(vma);
unlock_vma_mappings(vma);}這樣做的目的是,可以方便使用grep等工具,利用正則表達(dá)式,在很多源文件中快速定位某個函數(shù)定義所在的文件。6.2聲明在函數(shù)的聲明(prototype)中保留參數(shù)的名字。雖然語法上這可以省略,但可以增強(qiáng)可讀性:externlongvread(char*buf,char*addr,unsignedlongcount);而不是寫成這樣:externlongvread(char*,char*,unsignedlong);6.3返回值有兩類典型的函數(shù)返回值類型:返回0表示成功,非0作為錯誤碼返回并表示失敗;作為布爾值返回,非0表示成功,0表示失敗。為避免這種不統(tǒng)一造成混淆,規(guī)定如下:如果函數(shù)行為是一些操作和命令,則使用第一種類型返回值;如果函數(shù)行為是一判斷,則使用第二種類型返回值。對于其他返回實(shí)際結(jié)果的函數(shù)不在這限制之列。例如,指針類型的返回值,非NULL代表具體內(nèi)容,NULL表示失敗。6.4函數(shù)體函數(shù)內(nèi)部,變量定義部分與代碼部分中間隔一空行。代碼之間根據(jù)邏輯關(guān)系可以加空行來分隔。return與返回值之間加一空格,除非函數(shù)類型為void,此時return后面直接為分號。返回值不需要用括號括住,除非返回表達(dá)式很復(fù)雜,影響了可讀性。示例:staticintis_chained_kmem_cache(kmem_cache_t*cachep){
structlist_head*p;
intret=0;
/*Findthecacheinthechainofcaches.*/
down(&cache_chain_sem);
list_for_each(p,&cache_chain){
if(p==&cachep->next){
ret=1;
break;
}
}
up(&cache_chain_sem);
returnret;}7預(yù)處理和枚舉7.1基本規(guī)則使用大寫字母來命名宏常量和枚舉中的符號。當(dāng)定義一組相關(guān)的常量時,使用枚舉比宏常量更合適。“#”與include、define等之間沒有空白,include、define等與后面的代碼加一個空格(存在的話)。預(yù)處理符號都是頂頭書寫,不縮進(jìn),即使在復(fù)雜的分支結(jié)構(gòu)中:#include<stdio.h>#include"myheader.h"#defineMAXSIZE100#ifdefCONFIG_DEBUG_SLAB#defineDEBUG
1#defineSTATS
1#defineFORCED_DEBUG
1#else#defineDEBUG
0#defineSTATS
0#defineFORCED_DEBUG
0#endif宏函數(shù)用小寫字母來命名。注意使用括號來括住相關(guān)的表達(dá)式:#definecc_entry(cache)((void**)(((cache_t*)(cache))+1))7.2多語句宏由多條操作語句組成的宏可使用do-while結(jié)構(gòu)。如:#defineCHECK_PAGE(page)
\
do{
\
CHECK_NR(page);
\
if(!PageSlab(page)){
\
printk(KERN_ERR"badptr%lxh.\n",\
(unsignedlong)objp);
\
BUG();
\
}
\
}while(0)7.3宏的禁止寫法禁止以如下方式使用宏:(1).改變程序流程:#defineFOO(x)
\
do{
\
if(blah(x)<0)
\
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職(藥品檢驗員)藥品檢驗綜合測試題及答案
- 2025年高職(食品工藝技術(shù))面包烘焙單元測試試題及答案
- 應(yīng)用文寫作研究報告測試試題及答案
- 2025至2030中國數(shù)據(jù)中心建設(shè)市場現(xiàn)狀與投資規(guī)劃分析報告
- 2025至2030中國土壤修復(fù)工程行業(yè)資金到位周期及技術(shù)適用性評估報告
- 福鼎市2024-2025學(xué)年第二學(xué)期四年級英語期末學(xué)業(yè)測評考試題目及答案
- 2025-2030汽車銷售行業(yè)市場供需調(diào)研及投資評估規(guī)劃分析研究報告
- 2025-2030汽車工業(yè)智能轉(zhuǎn)型分析市場測評產(chǎn)業(yè)投資規(guī)劃研究報告
- 2025-2030汽車后市場汽車維修保養(yǎng)服務(wù)增值業(yè)務(wù)模式競爭格局前景分析報告
- 2025-2030汽車制造業(yè)智能網(wǎng)聯(lián)技術(shù)應(yīng)用推廣路線圖研究
- 江蘇省高級人民法院勞動爭議案件審理指南
- 夾套管施工方案
- 地面人工開挖施工方案
- 物業(yè)房屋中介合作協(xié)議
- 眼科常見疾病診療規(guī)范診療指南2022版
- 新郎父親在婚禮上的精彩講話稿范文(10篇)
- (山東)通風(fēng)與空調(diào)工程施工資料表格大全(魯TK001-057)
- 大鵬新區(qū)保護(hù)與發(fā)展綜合規(guī)劃(2013-2020)
- 戰(zhàn)略成本1-6章toc經(jīng)典案例
- DB37-T 5026-2022《居住建筑節(jié)能設(shè)計標(biāo)準(zhǔn)》
- 虛擬電廠(共30張PPT)
評論
0/150
提交評論