影響C++/C程序的幾大要素
C++/C程序?qū)瘮?shù)的處理方式是不同的。extern “C”是使C++能夠調(diào)用C寫(xiě)作的庫(kù)文件的一個(gè)手段,如果要對(duì)編譯器提示使用C的方式來(lái)處理函數(shù)的話,那么就要使用extern “C”來(lái)說(shuō)明。
若研究項(xiàng)目小組的所有開(kāi)發(fā)人員都遵循統(tǒng)一的、鮮明的一套編程風(fēng)格,可以讓協(xié)作者、后繼者和自己一目了然,在很短的時(shí)間內(nèi)看清楚程序結(jié)構(gòu),理解設(shè)計(jì)的思路,大大提高代碼的可讀性、可重用性、程序健壯性、可移植性、可維護(hù)性。
制定本編程規(guī)范的目的是為了提高軟件開(kāi)發(fā)效率及所開(kāi)發(fā)軟件的可維護(hù)性,提高軟件的質(zhì)量。本規(guī)范由程序風(fēng)格、命名規(guī)范、注釋規(guī)范、程序健壯性、可移植性、錯(cuò)誤處理以及軟件的模塊化規(guī)范等部分組成。
每個(gè)C++/C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的聲明(declaration),稱(chēng)為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)(implementation),稱(chēng)為定義(definition)文件。
C++/C程序的頭文件以“.h”為后綴,C程序的定義文件以“.c”為后綴,C++程序的定義文件通常以“.cpp”為后綴(也有一些系統(tǒng)以“.cc”或“.cxx”為后綴)。早期的編程語(yǔ)言如Basic、Fortran沒(méi)有頭文件的概念,C++/C語(yǔ)言的初學(xué)者雖然會(huì)用使用頭文件,但常常不明其理。這里對(duì)頭文件的作用略作解釋?zhuān)?/p>
(1) 通過(guò)頭文件來(lái)調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶(hù)公布,只要向用戶(hù)提供頭文件和二進(jìn)制的庫(kù)即可。用戶(hù)只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼;
(2) 頭文件能加強(qiáng)類(lèi)型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。assert不是一個(gè)倉(cāng)促拼湊起來(lái)的宏。為了不在程序的Debug版本和Release版本引起差別,assert不應(yīng)該產(chǎn)生任何副作用。
所以assert不是函數(shù),而是宏。程序員可以把a(bǔ)ssert看成一個(gè)在任何系統(tǒng)狀態(tài)下都可以安全使用的無(wú)害測(cè)試手段。如果程序在assert處終止了,并不是說(shuō)含有該assert的函數(shù)有錯(cuò)誤,而是調(diào)用者出了差錯(cuò),assert可以幫助我們找到發(fā)生錯(cuò)誤的原因。
絕大多數(shù)人都把細(xì)節(jié)太多(或者用貶義詞來(lái)說(shuō)就是“陰暗角落太多”)歸結(jié)為C++的本質(zhì)問(wèn)題,認(rèn)為一切邪惡由此而生。也正因此,大約9月份的時(shí)候,Linus在郵件列表上說(shuō)“C++/C程序是一門(mén)有思想包袱的語(yǔ)言;僅僅是為了讓程序員遠(yuǎn)離C++,我也要用C”。這句短短的話在國(guó)內(nèi)引起了很大的反應(yīng),最初是劉江轉(zhuǎn)了Linus的話,然后云風(fēng)和孟巖都發(fā)表了自己的看法;我也寫(xiě)了一篇“Why C++”(后來(lái)發(fā)給Bjarne,Bjarne對(duì)這篇文章做了一個(gè)友情評(píng)注)。
然而,這一通渾水?dāng)囘^(guò)之后,我相信引起的變化未必很大。大多數(shù)原先的反對(duì)者能從中找出反對(duì)的理由,于是更加反對(duì);大多數(shù)原先的贊同者也能從中找到贊同的理由,于是更加贊同;而剩下來(lái)的原先沒(méi)有明確意見(jiàn)的,看雙方各有各的道理,可能還是沒(méi)有頭緒。
【編輯推薦】