日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]這篇簡(jiǎn)短的文章描述了Linux內(nèi)核首選的編碼風(fēng)格。編碼風(fēng)格是很個(gè)人化的東西,我不會(huì)把自己的觀點(diǎn)強(qiáng)加給任何人。但是,Linux內(nèi)核的代碼畢竟是我必須有能力維護(hù)的,因此我寧愿它的編碼風(fēng)格是我喜歡的。

這篇簡(jiǎn)短的文章描述了Linux內(nèi)核首選的編碼風(fēng)格。編碼風(fēng)格是很個(gè)人化的東西,我不會(huì)把自己的觀點(diǎn)強(qiáng)加給任何人。但是,Linux內(nèi)核的代碼畢竟是我必須有能力維護(hù)的,因此我寧愿它的編碼風(fēng)格是我喜歡的。請(qǐng)至少考慮一下這一點(diǎn)。

首先,我建議打印一份《GNU編碼標(biāo)準(zhǔn)》,不要閱讀它。燒掉它,它不過是象征性的姿態(tài)。

然后,請(qǐng)看:

第 1 章: 縮進(jìn)

Tabs(制表符)是8個(gè)字符的大小,因此縮進(jìn)也應(yīng)該是8個(gè)字符的大小。有些叛逆主張?jiān)噲D把縮進(jìn)變成4個(gè)(甚至是2個(gè)!)字符的長(zhǎng)度,這就好象試圖把PI(案,圓周率)定義成3是一樣的。

依據(jù):縮進(jìn)背后的思想是:清楚地定義一個(gè)控制塊從哪里開始,到哪里結(jié)束。尤其是在你連續(xù)不斷的盯了20個(gè)小時(shí)的屏幕后,如果你有大尺寸的縮進(jìn)。你將更容易發(fā)現(xiàn)縮進(jìn)的好處。

現(xiàn)在,有些人說8個(gè)字符大小的縮進(jìn)導(dǎo)致代碼太偏右了,并且在一個(gè)80字符寬的終端屏幕上看著很不舒服。對(duì)這個(gè)問題的回答是:如果你有超過3個(gè)級(jí)別的縮進(jìn),你就有點(diǎn)犯糊涂了,應(yīng)當(dāng)修改你的程序。

簡(jiǎn)而言之,8個(gè)字符的縮進(jìn)使程序更易讀,而且當(dāng)你把功能隱藏的太深時(shí),多層次的縮進(jìn)還會(huì)對(duì)此很直觀的給出警告。要留心這種警告信息。

第 2 章: 放置花括號(hào)

C程序中另一個(gè)要主意的就是花括號(hào)的放置。與縮進(jìn)尺寸不同的是,關(guān)于如何放置花括號(hào)沒有技術(shù)上的理由。但是,首選的方法是象先知Brain Kernighan和Dennis Ritchie展現(xiàn)的那樣:把左括號(hào)放在行尾,右括號(hào)放在行首。也就是:

if (x is true) {

??we do y

}

然而,還有另外一種情況,就是函數(shù):函數(shù)應(yīng)當(dāng)把左右括號(hào)都放在行首。也就是:

int function(int x)

{

body of function

}

叛逆的人們所在皆有。他們說,這樣會(huì)導(dǎo)致…嗯,不一致性(案,指函數(shù)的花括號(hào)使用與其他情況不統(tǒng)一)。但是所有正確思考的人都知道:(1) K&R是正確的;(2) K&R還是正確的。 而且,函數(shù)與別任何東西都不一樣(在C語(yǔ)言中你沒法隱藏它)。

注意,右括號(hào)所在的行不應(yīng)當(dāng)有其它東西,除非跟隨著一個(gè)條件判斷。也就是do-while語(yǔ)句中的“while”和if-else語(yǔ)句中的“else”。象這樣:

do {

body of do-loop

}while (condition);

和:

if (x == y) {

..

}else if (x > y) {

...

}else {

??....

}

依據(jù): K&R。

而且,注意這種花括號(hào)的放置減少了空行的數(shù)目,并沒損害可讀性。因此,當(dāng)屏幕上不可以有很多空行時(shí)(試想25行的終端屏幕),你就有更多的空行來安插注釋。

第 3 章: 命名

C是一門樸素的語(yǔ)言,你使用的命名也應(yīng)該這樣。與Modula-2和Pascal程序員不同,C程序員不使用諸如“ThisVariableIsATemporaryCounter”這樣“聰明”的名字。C程序員應(yīng)該叫它“tmp”,這寫起來更簡(jiǎn)單,也不會(huì)更難懂。

然而,當(dāng)面對(duì)復(fù)雜情況時(shí)就有些棘手,給全局變量取一個(gè)描述性的名字是必要的。把一個(gè)全局函數(shù)叫做“foo”是一種目光短淺的行為。

全局變量(只當(dāng)你確實(shí)需要時(shí)才用)應(yīng)該有描述性的名字,全局函數(shù)也一樣。如果你有一個(gè)統(tǒng)計(jì)當(dāng)前用戶個(gè)數(shù)的函數(shù),應(yīng)當(dāng)把它命名為“count_active_user()”或者簡(jiǎn)單點(diǎn)些的類似名稱,不應(yīng)該命名為“cntusr()”。

把函數(shù)類型寫進(jìn)函數(shù)名(即所謂的“匈牙利命名法”)簡(jiǎn)直就是大腦有問題──編譯器總是知道函數(shù)的類型并且能加以檢查,這種命名法只會(huì)弄糊涂程序員自己。怪不得微軟總是制造充滿bug的程序。

局部變量的名字應(yīng)該盡量短,而且說到點(diǎn)子上。如果你有個(gè)普通的整型循環(huán)計(jì)數(shù)變量,應(yīng)當(dāng)命名為“i”。命名為“loop_counter”并不能帶來任何成效,如果它不被誤解的話(案,這里的言外之意是說,如果被誤解就更慘了)。與此類似,“tmp”可以作為一個(gè)用來存儲(chǔ)任何類型臨時(shí)值的變量的名字。

如果你害怕弄混淆局部變量(s)的名字,你就面臨著另一個(gè)問題,也叫作“函數(shù)增長(zhǎng)荷爾蒙失調(diào)綜合癥”。請(qǐng)參考下一章。

第 4 章: 函數(shù)

函數(shù)應(yīng)當(dāng)短而精美,而且只做一件事。它們應(yīng)當(dāng)占滿1或2個(gè)屏幕(就象我們知道的那樣,ISO/ANSI的屏幕大小是80X24),只做一件事并且把它做好。

一個(gè)函數(shù)的最大長(zhǎng)度與它的復(fù)雜度和縮進(jìn)級(jí)別成反比。所以,如果如果你有一個(gè)概念上簡(jiǎn)單(案,“簡(jiǎn)單”是simple而不是easy)的函數(shù),它恰恰包含著一個(gè)很長(zhǎng)的case語(yǔ)句,這樣你不得不為不同的情況準(zhǔn)備不懂的處理,那么這樣的長(zhǎng)函數(shù)是沒問題的。

然而,如果你有一個(gè)復(fù)雜的函數(shù),你猜想一個(gè)并非天才的高一學(xué)生可能看不懂得這個(gè)函數(shù),你就應(yīng)當(dāng)努力把它減縮得更接近前面提到的最大函數(shù)長(zhǎng)度限制。可以使用一些輔助函數(shù),給它們?nèi)∶枋鲂缘拿?如果你認(rèn)為這些輔助函數(shù)的調(diào)用是性能關(guān)鍵的,可以讓編譯器把它們內(nèi)聯(lián)進(jìn)來,這比在單個(gè)函數(shù)內(nèi)完成所有的事情通常要好些)。

對(duì)函數(shù)還存在另一個(gè)測(cè)量標(biāo)準(zhǔn):局部變量的數(shù)目。這不該超過5到10個(gè),否則你可能會(huì)弄錯(cuò)。應(yīng)當(dāng)重新考慮這個(gè)函數(shù),把它分解成小片。人類的大腦一般能同時(shí)記住7個(gè)不同的東西,超過這個(gè)數(shù)目就會(huì)犯糊涂?;蛟S你認(rèn)為自己很聰明,那么請(qǐng)你理解一下從現(xiàn)在開始的2周時(shí)間你都做什么了。

第 5 章:注釋

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

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

第 6 章:你把事情弄亂了

好吧,我們來看看。很可能有長(zhǎng)期使用UNIX的人告訴過你,“GNU emacs”能自動(dòng)為你格式化C程序源代碼,你注意到這是真的,它確實(shí)能做到,但是缺省情況下它的用處遠(yuǎn)遠(yuǎn)小于期望值──鍵入無(wú)數(shù)的monkeys到GNU emacs中絕不可能造出好的程序。

因此,你可以或者刪除GNU emacs,或者對(duì)它進(jìn)行理智的配置。對(duì)于后者,可以把下面的行粘貼到你的.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))

這將會(huì)定義一個(gè)把C代碼弄成linux風(fēng)格的命令。當(dāng)hacking一個(gè)模塊時(shí),如果你把“-*- linux-c-*-”放到了最初的兩行,這個(gè)模塊將被自動(dòng)調(diào)用。而且,如果你打算每當(dāng)在/usr/src/linux下編輯源文件時(shí)就自動(dòng)調(diào)用它,也許你會(huì)把下面的命令:

(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.ch$" . linux-c-mode)

auto-mode-alist))

添加進(jìn)你的.emacs文件。

但是,即使你沒能讓emacs正確做到格式化,也并非將就此一無(wú)所有:還有“indent”程序呢。

嗯,再提醒一下,GNU indent跟GNU emacs有同樣的毛病,這就需要你給它一些命令行選項(xiàng)。然而,這不是很糟糕的事,因?yàn)榧词故荊NU indent也承認(rèn)K&R的權(quán)威性(GNU的人不是魔鬼,他們只是在這里太過嚴(yán)格了,以致于誤導(dǎo)人),所以你可以只需給indent這樣的選項(xiàng):“-kr -i8”(表示“K&R風(fēng)格,8個(gè)字符的縮進(jìn)”)。

“indent”程序有很多選項(xiàng),特別是當(dāng)為重排過的程序作注釋的時(shí)候,你需要看一下它的手冊(cè)。記住:“indent”可不是修正糟糕程序的萬(wàn)能鑰匙。

第 7 章: 配置文件(configuration-files)

對(duì)配置選項(xiàng)來說(arch/xxx/config.in和所有的Config.in文件),使用不同的縮進(jìn)風(fēng)格。

若代碼中的縮進(jìn)級(jí)別為3,配置選項(xiàng)就應(yīng)該為2,這樣可以暗示出依賴關(guān)系。后者只是用于bool/tristate(即二態(tài)/三態(tài))的選項(xiàng)。對(duì)其它情況用常識(shí)就行了。舉例來說:

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àng)的周圍出現(xiàn)。所有已知會(huì)破壞數(shù)據(jù)的選項(xiàng)(如文件系統(tǒng)的實(shí)驗(yàn)性的寫支持功能)應(yīng)當(dāng)被標(biāo)記為(DANGEROUS),其他實(shí)驗(yàn)性的選項(xiàng)應(yīng)當(dāng)被標(biāo)記為(EXPERIMENTAL)。

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

假如數(shù)據(jù)結(jié)構(gòu)在其被創(chuàng)建/銷毀的線程環(huán)境(案:這里說的線程是一個(gè)執(zhí)行實(shí)體,可能是進(jìn)程、內(nèi)核線程或其它)之外還具有可見性,那么他們都該有引用計(jì)數(shù)。

在內(nèi)核中沒有垃圾收集機(jī)制(而且內(nèi)核之外的垃圾收集也是緩慢而低效的),這意味著你絕對(duì)應(yīng)該為每一次使用進(jìn)行引用計(jì)數(shù)。

引用計(jì)數(shù)意味著你可以避開鎖,還能允許多個(gè)線程并行訪問該數(shù)據(jù)結(jié)構(gòu)──而且不用擔(dān)心僅僅因?yàn)樵L問數(shù)據(jù)結(jié)構(gòu)的線程睡眠了一會(huì)兒或者干別的去了,它們就會(huì)消失。

注意,鎖不是引用計(jì)數(shù)的替代品。鎖是用來保持?jǐn)?shù)據(jù)結(jié)構(gòu)的一致性的,而引用計(jì)數(shù)是一種內(nèi)存管理技術(shù)。通常二者都需要,而且不會(huì)彼此混淆。

確實(shí)有許多數(shù)據(jù)結(jié)構(gòu)可以有兩個(gè)級(jí)別的引用計(jì)數(shù),當(dāng)使用者具有不同的“等級(jí)”(classes)時(shí)就是這樣。子等級(jí)(subclass)記錄了處于該等級(jí)的使用者個(gè)數(shù),而且當(dāng)它減到零的時(shí)候就把總體計(jì)數(shù)(global count)減一。

這種“多級(jí)引用計(jì)數(shù)”(multi-reference-counting)的一個(gè)實(shí)例可以在內(nèi)存管理子系統(tǒng)("struct mm_struct":mm_users和mm_count)中找到,也可以在文件系統(tǒng)的代碼中("struct super_block":s_count和s_active)找到。

記住:如果另一個(gè)線程能找到你的數(shù)據(jù)結(jié)構(gòu),而你有沒對(duì)它做引用計(jì)數(shù),那幾乎可以肯定:這是一個(gè)bug。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉