關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)_第1頁
關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)_第2頁
關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)_第3頁
關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)_第4頁
關(guān)于C編程過程中應(yīng)該注意的事項(書寫習(xí)慣以及快捷鍵使用)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論