黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 面授課程 模擬考試 實用文檔 繽紛校園 英語學(xué)習(xí)
2010考研 | 自學(xué)考試 | 成人高考 | 專 升 本 | 法律碩士 | MBA/MPA | 中 科 院
四六級 | 商務(wù)英語 | 公共英語 | 職稱日語 | 職稱英語 | 博思 | 口譯筆譯 | GRE GMAT | 日語 | 托福
雅思 | 專四專八 | 新概念 | 自考英語 | 零起點英韓語 | 在職申碩英語
在職攻碩英語 | 成人英語三級
等級考試 | 水平考試 | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
公務(wù)員 | 報關(guān)員 | 報檢員 | 外銷員 | 司法考試 | 導(dǎo)游考試 | 教師資格 | 國際商務(wù)師 | 跟單員
單證員 | 物流師 | 價格鑒證師 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 人力資源管理師 | 管理咨詢師
期貨從業(yè)資格 | 社會工作者
會計職稱 | 注會CPA | 經(jīng)濟師 | 統(tǒng)計師 | 注冊稅務(wù)師 | 評估師 | 精算師 | 高會 | ACCA | 審計師
法律顧問 | 會計證
建造師一級二級) | 造價師 | 監(jiān)理師 | 安全師 | 咨詢師 | 結(jié)構(gòu)師 | 建筑師 | 安全評價師
估價師房地產(chǎn)估價土地估價) | 設(shè)備監(jiān)理師 | 巖土工程師 | 質(zhì)量資格 | 房地產(chǎn)經(jīng)紀(jì)人 | 造價員
投資項目管理 | 土地代理人 | 環(huán)保師 | 環(huán)境影響評價 | 物業(yè)管理師 | 城市規(guī)劃師 | 公路監(jiān)理師
公路造價工程師 | 招標(biāo)師
執(zhí)業(yè)護士 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 衛(wèi)生資格
 丹丹云 
您現(xiàn)在的位置: 考試吧(Exam8.com) > 軟件水平考試 > 心得技巧 > 正文

C程序代碼風(fēng)格

    下面這篇文章是linux內(nèi)核中Documentation/CodingStyle文件,覺得挺有意思,就順手把它譯出來了,因為雖然這只是“l(fā)inux”的代碼風(fēng)格,但優(yōu)秀的C程序風(fēng)格大致無二。特別是emacs相關(guān)的東西,肯定有誤譯,請多指正。

    Linux內(nèi)核編碼風(fēng)格

    這篇簡短的文章描述了Linux內(nèi)核首選的編碼風(fēng)格。編碼風(fēng)格是很個人化的東西,我不會把自己的觀點強加給任何人。但是,Linux內(nèi)核的代碼畢竟是我必須有能力維護的,因此我寧愿它的編碼風(fēng)格是我喜歡的。請至少考慮一下這一點。
   
    首先,我建議打印一份《GNU編碼標(biāo)準(zhǔn)》,不要閱讀它。燒掉它,它不過是象征性的姿態(tài)。
   
    然后,請看: 

    第 1 章: 縮進

    Tabs(制表符)是8個字符的大小,因此縮進也應(yīng)該是8個字符的大小。有些叛逆主張試圖把縮進變成4個(甚至是2個!)字符的長度,這就好象試圖把PI(案,圓周率)定義成3是一樣的。
   
    依據(jù):縮進背后的思想是:清楚地定義一個控制塊從哪里開始,到哪里結(jié)束。尤其是在你連續(xù)不斷的盯了20個小時的屏幕后,如果你有大尺寸的縮進。你將更容易發(fā)現(xiàn)縮進的好處。
   
    現(xiàn)在,有些人說8個字符大小的縮進導(dǎo)致代碼太偏右了,并且在一個80字符寬的終端屏幕上看著很不舒服。對這個問題的回答是:如果你有超過3個級別的縮進,你就有點犯糊涂了,應(yīng)當(dāng)修改你的程序。
   
    簡而言之,8個字符的縮進使程序更易讀,而且當(dāng)你把功能隱藏的太深時,多層次的縮進還會對此很直觀的給出警告。要留心這種警告信息。 
    
    第 2 章: 放置花括號

    C程序中另一個要主意的就是花括號的放置。與縮進尺寸不同的是,關(guān)于如何放置花括號沒有技術(shù)上的理由。但是,首選的方法是象先知Brain Kernighan和Dennis Ritchie展現(xiàn)的那樣:把左括號放在行尾,右括號放在行首。也就是:
   
   if (x is true) {
      we do y
   }
   
    然而,還有另外一種情況,就是函數(shù):函數(shù)應(yīng)當(dāng)把左右括號都放在行首。也就是:
   
   int function(int x)
   {
      body of function
   }
   
    叛逆的人們所在皆有。他們說,這樣會導(dǎo)致…嗯,不一致性(案,指函數(shù)的花括號使用與其他情況不統(tǒng)一)。但是所有正確思考的人都知道:(1) K&R是正確的;(2) K&R還是正確的。 而且,函數(shù)與別任何東西都不一樣(在C語言中你沒法隱藏它)。
   
    注意,右括號所在的行不應(yīng)當(dāng)有其它東西,除非跟隨著一個條件判斷。也就是do-while語句中的“while”和if-else語句中的“else”。象這樣:
   
   do {
      body of do-loop
   } while (condition);
   
和:
   
   if (x == y) {
      ..
   } else if (x > y) {
      ...
   } else {
      ....
   }
   
    依據(jù): K&R。
   
    而且,注意這種花括號的放置減少了空行的數(shù)目,并沒損害可讀性。因此,當(dāng)屏幕上不可以有很多空行時(試想25行的終端屏幕),你就有更多的空行來安插注釋。 
    
    第 3 章: 命名

    C是一門樸素的語言,你使用的命名也應(yīng)該這樣。與Modula-2和Pascal程序員不同,C程序員不使用諸如“ThisVariableIsATemporaryCounter”這樣“聰明”的名字。C程序員應(yīng)該叫它“tmp”,這寫起來更簡單,也不會更難懂。 
 
    然而,當(dāng)面對復(fù)雜情況時就有些棘手,給全局變量取一個描述性的名字是必要的。把一個全局函數(shù)叫做“foo”是一種目光短淺的行為。
   
    全局變量(只當(dāng)你確實需要時才用)應(yīng)該有描述性的名字,全局函數(shù)也一樣。如果你有一個統(tǒng)計當(dāng)前用戶個數(shù)的函數(shù),應(yīng)當(dāng)把它命名為“count_active_user()”或者簡單點些的類似名稱,不應(yīng)該命名為“cntusr()”。
   
    把函數(shù)類型寫進函數(shù)名(即所謂的“匈牙利命名法”)簡直就是大腦有問題──編譯器總是知道函數(shù)的類型并且能加以檢查,這種命名法只會弄糊涂程序員自己。怪不得微軟總是制造充滿bug的程序。
   
    局部變量的名字應(yīng)該盡量短,而且說到點子上。如果你有個普通的整型循環(huán)計數(shù)變量,應(yīng)當(dāng)命名為“i”。命名為“l(fā)oop_counter”并不能帶來任何成效,如果它不被誤解的話(案,這里的言外之意是說,如果被誤解就更慘了)。與此類似,“tmp”可以作為一個用來存儲任何類型臨時值的變量的名字。
   
    如果你害怕弄混淆局部變量(s)的名字,你就面臨著另一個問題,也叫作“函數(shù)增長荷爾蒙失調(diào)綜合癥”。請參考下一章。 
    
    第 4 章: 函數(shù)

    函數(shù)應(yīng)當(dāng)短而精美,而且只做一件事。它們應(yīng)當(dāng)占滿1或2個屏幕(就象我們知道的那樣,ISO/ANSI的屏幕大小是80X24),只做一件事并且把它做好。
 
    一個函數(shù)的最大長度與它的復(fù)雜度和縮進級別成反比。所以,如果如果你有一個概念上簡單(案,“簡單”是simple而不是easy)的函數(shù),它恰恰包含著一個很長的case語句,這樣你不得不為不同的情況準(zhǔn)備不懂的處理,那么這樣的長函數(shù)是沒問題的。
   
    然而,如果你有一個復(fù)雜的函數(shù),你猜想一個并非天才的高一學(xué)生可能看不懂得這個函數(shù),你就應(yīng)當(dāng)努力把它減縮得更接近前面提到的最大函數(shù)長度限制。可以使用一些輔助函數(shù),給它們?nèi)∶枋鲂缘拿?如果你認(rèn)為這些輔助函數(shù)的調(diào)用是性能關(guān)鍵的,可以讓編譯器把它們內(nèi)聯(lián)進來,這比在單個函數(shù)內(nèi)完成所有的事情通常要好些)。
   
    對函數(shù)還存在另一個測量標(biāo)準(zhǔn):局部變量的數(shù)目。這不該超過5到10個,否則你可能會弄錯。應(yīng)當(dāng)重新考慮這個函數(shù),把它分解成小片。人類的大腦一般能同時記住7個不同的東西,超過這個數(shù)目就會犯糊涂。或許你認(rèn)為自己很聰明,那么請你理解一下從現(xiàn)在開始的2周時間你都做什么了。 

    第 5 章:注釋

    注釋是有用的,但過量的注釋則是有害的。不要試圖在注釋中解釋你的代碼是如何工作的:把代碼是如何工作的視為一件顯然的事情會更好些,而且,給糟糕的代碼作注釋則是在浪費時間。

    通常,你愿意自己的注釋說出代碼是做什么的,而不是如何做。還有,盡量避免在函數(shù)體內(nèi)作注釋:如果函數(shù)很復(fù)雜,你很可能需要分開來注釋,回頭到第4章去看看吧。你可以給一段代碼──漂亮的或丑陋的──作注釋以引起注意或警告,但是不要過量。取而代之,應(yīng)當(dāng)把注釋放在函數(shù)首部,告訴人們該函數(shù)作什么,而不是為什么這樣做。 

    第 6 章:你把事情弄亂了

    好吧,我們來看看。很可能有長期使用UNIX的人告訴過你,“GNU emacs”能自動為你格式化C程序源代碼,你注意到這是真的,它確實能做到,但是缺省情況下它的用處遠遠小于期望值──鍵入無數(shù)的monkeys到GNU emacs中絕不可能造出好的程序。
 
    因此,你可以或者刪除GNU emacs,或者對它進行理智的配置。對于后者,可以把下面的行粘貼到你的.emacs文件中:
   
   (defun linux-c-mode ()
   "C mode with adjusted defaults for use with the Linux kernel."
   (interactive)
   (c-mode)
   (c-set-style "K&R")
   (setq c-basic-offset 8))
   
    這將會定義一個把C代碼弄成linux風(fēng)格的命令。當(dāng)hacking一個模塊時,如果你把“-*- linux-c -*-”放到了最初的兩行,這個模塊將被自動調(diào)用。而且,如果你打算每當(dāng)在/usr/src/linux下編輯源文件時就自動調(diào)用它,也許你會把下面的命令:
   (setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode)
            auto-mode-alist))
    添加進你的.emacs文件。
   
    但是,即使你沒能讓emacs正確做到格式化,也并非將就此一無所有:還有“indent”程序呢。
   
    嗯,再提醒一下,GNU indent跟GNU emacs有同樣的毛病,這就需要你給它一些命令行選項。然而,這不是很糟糕的事,因為即使是GNU indent也承認(rèn)K&R的權(quán)威性(GNU的人不是魔鬼,他們只是在這里太過嚴(yán)格了,以致于誤導(dǎo)人),所以你可以只需給indent這樣的選項:“-kr -i8”(表示“K&R風(fēng)格,8個字符的縮進”)。
   
    “indent”程序有很多選項,特別是當(dāng)為重排過的程序作注釋的時候,你需要看一下它的手冊。記住:“indent”可不是修正糟糕程序的萬能鑰匙。 
    
    第 7 章: 配置文件(configuration-files)

    對配置選項來說(arch/xxx/config.in和所有的Config.in文件),使用不同的縮進風(fēng)格。
 
    若代碼中的縮進級別為3,配置選項就應(yīng)該為2,這樣可以暗示出依賴關(guān)系。后者只是用于bool/tristate(即二態(tài)/三態(tài))的選項。對其它情況用常識就行了。舉例來說:

   if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
      tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM
      if [ "$CONFIG_BOOM" != "n" ]; then
         bool '  Output nice messages when you explode' CONFIG_CHEER
      fi
   fi

    通常CONFIG_EXPERIMENTAL應(yīng)當(dāng)在所有不穩(wěn)定的選項的周圍出現(xiàn)。所有已知會破壞數(shù)據(jù)的選項(如文件系統(tǒng)的實驗性的寫支持功能)應(yīng)當(dāng)被標(biāo)記為(DANGEROUS),其他實驗性的選項應(yīng)當(dāng)被標(biāo)記為(EXPERIMENTAL)。 
    

    第 8 章: 數(shù)據(jù)結(jié)構(gòu)

    假如數(shù)據(jù)結(jié)構(gòu)在其被創(chuàng)建/銷毀的線程環(huán)境(案:這里說的線程是一個執(zhí)行實體,可能是進程、內(nèi)核線程或其它)之外還具有可見性,那么他們都該有引用計數(shù)。 在內(nèi)核中沒有垃圾收集機制(而且內(nèi)核之外的垃圾收集也是緩慢而低效的),這意味著你絕對應(yīng)該為每一次使用進行引用計數(shù)。
   
    引用計數(shù)意味著你可以避開鎖,還能允許多個線程并行訪問該數(shù)據(jù)結(jié)構(gòu)──而且不用擔(dān)心僅僅因為訪問數(shù)據(jù)結(jié)構(gòu)的線程睡眠了一會兒或者干別的去了,它們就會消失。
   
    注意,鎖不是引用計數(shù)的替代品。鎖是用來保持?jǐn)?shù)據(jù)結(jié)構(gòu)的一致性的,而引用計數(shù)是一種內(nèi)存管理技術(shù)。通常二者都需要,而且不會彼此混淆。 下面這篇文章是linux內(nèi)核中Documentation/CodingStyle文件,覺得挺有意思,就順手把它譯出來了,因為雖然這只是“l(fā)inux”的代碼風(fēng)格,但優(yōu)秀的C程序風(fēng)格大致無二。特別是emacs相關(guān)的東西,肯定有誤譯,請多指正。

轉(zhuǎn)帖于:軟件水平考試_考試吧
文章搜索
C程序代碼風(fēng)格網(wǎng)友評論網(wǎng)友評論
版權(quán)聲明 --------------------------------------------------------------------------------------
    如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。
 
主站蜘蛛池模板: 日本成人a视频 | 丁香天堂网| 免费国产高清精品一区在线 | 99视频免费 | 成人高清在线观看播放 | 夭天曰天天躁天 | 成人免费观看一区二区 | 日本黄色小说网站 | 久久狠色噜噜狠狠狠狠97 | 日本羞羞无遮挡免费动漫 | 国产成人免费视频 | 日本免费观看95视频网站 | 国内精品久久久久久久aa护士 | 天天干天天日天天射天天操毛片 | 欧美成人久久 | 一级一片在线播放在线观看 | 亚洲第一天堂无码专区 | 婷婷视频在线观看 | 一级做a爰片久久毛片武则天 | 亚洲一区欧美二区 | 国产高清区 | 欧美日本黄色片 | 黄色精品视频 | 国产三级国产精品国产普男人 | 精品乱人伦一区二区 | 欧美成人午夜 | 一级特黄aaa免费 | 国产成人精品日本亚洲18图 | 欧美亚洲国产片在线观看 | 有哪些免费的毛片可以看 | 亚洲综合激情在线影院 | 操美女在线观看 | www.蜜臀| 一级特黄aaa大片 | 狠狠色欧美亚洲狠狠色五 | 最近最新中文字幕免费高清1 | 日韩精品亚洲人成在线播放 | 日日夜人人澡人人澡人人看免 | 亚洲狼人香蕉香蕉在线28 | 在线黄色毛片 | 最近中文字幕在线6 |