国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核編碼風格權威總結:從縮進到底層設計,讓你的代碼更“內核味”

jf_44130326 ? 來源:Linux1024 ? 2026-02-09 16:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作為全球最龐大的開源項目之一,Linux內核的代碼量早已突破千萬行。要讓來自世界各地的開發(fā)者高效協(xié)作,一套統(tǒng)一、嚴謹?shù)木幋a風格必不可少——這不僅是代碼顏值的要求,更是可讀性、可維護性的核心保障。

今天,我們就基于Linux內核官方文檔(https://www.kernel.org/doc/html/latest/process/coding-style.html),提煉一份「內核級」編碼指南,無論你是剛接觸內核開發(fā)的新手,還是想規(guī)范代碼風格的老兵,都能從中找到實用參考。

wKgZPGkaiwyALJ3-AAJ496o0Exs512.png

一、基礎格式:縮進與換行,細節(jié)定成敗

內核編碼風格對基礎格式的要求近乎嚴苛,核心原則是**“視覺清晰,無歧義”**

1.縮進:8個字符的Tab,不是空格!

?必須用Tab鍵縮進,且每個Tab對應8個字符(拒絕2/4字符縮進,文檔戲稱π定義為3一樣離譜)。

?理由:深層嵌套時更容易區(qū)分代碼塊,同時警告你嵌套過深(超過3層就該重構了)。

?例外:僅在注釋、文檔和Kconfig中可使用空格,其他場景絕對禁止用空格縮進。

2. switch-case對齊:別搞雙重縮進

switch語句的case標簽需與switch對齊,而非縮進一層,避免代碼過度右移:

// 正確示例switch(suffix) {case'G':case'g': // case與switch同列    mem <<=?30; // 邏輯代碼縮進8字符   break;case'M':case'm':    mem <<=?20;   break;default:   break;}

3.行寬:80列是軟上限

?單行長建議不超過80列,超長時需拆分(如函數(shù)參數(shù)、長表達式),拆分后子句需右移且短于父句

?例外:用戶可見字符串(如printk消息)不能拆分——否則會破壞grep搜索功能。

二、大括號與空格:內核風格的標志性符號

大括號({})和空格的位置,是內核代碼辨識度的關鍵,嚴格遵循K&R風格Kernighan & RitchieC語言之父)。

1.大括號位置:函數(shù)單獨成行,其他尾隨行末

?非函數(shù)塊if/switch/for/while):左大括號在語句末尾,右大括號單獨成行:

if(count >0) { //左括號在末尾    do_something();}else{     //else與右括號同列    do_nothing();}

?函數(shù)定義:左大括號必須在新行開頭,與函數(shù)名對齊:

// 正確示例intcount_active_users(void){ // 左括號單獨成行   intcount =0;   // 業(yè)務邏輯   returncount;}

2.空格使用:關鍵字要空格,函數(shù)/運算符看場景

?關鍵字后加空格if/switch/case/for/while后必須加空格(如if (x),而非if(x))。

?函數(shù)/運算符不加空格

?sizeof/typeof/alignof后不加空格(如sizeof(struct file),而非sizeof (struct file));

?指針*貼近變量名(如char *buf,而非char* buf);

?二元運算符(=/+/-/等)前后加空格,一元運算符(&/*/~等)后不加(如*ptr,而非* ptr)。

?禁止尾隨空格:行尾不能留空格(Git會警告,編輯器可配置自動刪除)。

三、命名規(guī)范:見名知意,拒絕花里胡哨

內核命名的核心是**“簡潔+區(qū)分作用域”**,杜絕冗余和歧義。

1.全局變量/函數(shù):長且descriptive

?全局符號(跨文件訪問)必須見名知意,禁止縮寫(如count_active_users()而非cntusr())。

?示例:struct user *active_user_list(全局變量,明確表示活躍用戶列表)。

2.局部變量:短且簡潔

?局部變量(函數(shù)內使用)用短名即可,如循環(huán)計數(shù)器用i,臨時變量用tmp,無需過度描述(如loop_counter反而冗余)。

3.禁用匈牙利命名

不要在變量名中加類型前綴(如iCountpBuf——編譯器會檢查類型,人類加前綴只會增加冗余,還可能因類型修改導致命名失效。

4.術語替代:拒絕“master/slave”等爭議詞

?替代方案:master→primary/mainslave→secondary/replicablacklist→denylistwhitelist→allowlist

四、函數(shù)設計:短、精、單職責,拒絕大而全

內核函數(shù)的設計哲學是**“做一件事,且做好”**,具體要求如下:

1.長度與復雜度:控制在“2屏內

?函數(shù)長度建議不超過2個屏幕(約40-50行),復雜邏輯必須拆分成helper函數(shù)(用static inline優(yōu)化性能)。

?局部變量不超過5-10個:人類大腦難以同時處理超過7個變量,過多則需拆分函數(shù)。

2.函數(shù)原型:參數(shù)必須帶名

函數(shù)聲明時,參數(shù)需寫清名稱(而非僅寫類型),方便讀者理解用途:

// 正確:帶參數(shù)名voidprocess_user(structuser *u,intaction);// 錯誤:僅寫類型voidprocess_user(structuser *,int);

3.統(tǒng)一退出:用goto清理操作

當函數(shù)有多個退出點(如分配內存后需釋放),推薦用goto統(tǒng)一清理,避免重復代碼:

intinit_buffer(void){   char*buf = kmalloc(SIZE, GFP_KERNEL);   if(!buf)       return-ENOMEM; // 直接退出(無清理)   if(init_data(buf) !=0) {       gotoout_free_buf; // 跳轉到清理邏輯    }   // 正常邏輯   return0;out_free_buf: // 清理標簽:命名需明確(如“釋放buf”)    kfree(buf);   return-EIO;}

注意:goto標簽需語義化(如out_free_buf),拒絕err1/err2這類無意義名稱。

五、注釋:說做什么,而非怎么做

內核注釋的核心是**“輔助理解,不冗余”**,拒絕解釋爛代碼

1.注釋原則:“What> How”

?不要解釋代碼邏輯(如“i自增1”),而要說明為什么這么做做什么(如統(tǒng)計活躍用戶數(shù),排除僵尸進程)。

?函數(shù)注釋:放在函數(shù)前,說明功能、參數(shù)含義、返回值(推薦用內核doc格式,見Documentation/doc-guide/)。

2.多行注釋格式:左對齊星號

多行注釋需用“/* ... */”,且每行開頭加*,保持左對齊:

/** 統(tǒng)計系統(tǒng)中活躍的用戶數(shù)量* 排除條件:1. 僵尸進程對應的用戶;2. 離線超過24小時的用戶* 返回值:活躍用戶數(shù)(>=0)*/intcount_active_users(void){   // ...}

3.數(shù)據(jù)注釋:每行一個變量,加說明

聲明變量時,每行只定義一個,并用注釋說明用途:

// 正確:每行一個,帶注釋intuser_count;  // 總用戶數(shù)char*user_name; // 當前用戶名// 錯誤:多變量一行,無注釋intuser_count, *user_name;

六、實用避坑指南:這些禁忌別踩

1. typedef:非必要不使用

僅在以下場景可用typedef,其他情況禁止(如struct不要typedef):

?完全opaque類型(如pte_t,只能通過接口訪問,不暴露內部結構);

?明確的整數(shù)類型(如u8/u16/u32,避免int/long混淆);

?稀疏檢查(sparse工具用于類型校驗)。

2.內存分配:安全優(yōu)先,避免錯誤

?sizeof(*p)而非硬寫類型:分配結構體指針時,用kmalloc(sizeof(*p), ...),避免類型修改導致的錯誤:

// 正確:無需關心p的類型structuser *p = kmalloc(sizeof(*p), GFP_KERNEL);// 錯誤:類型修改后需同步修改這里structuser *p = kmalloc(sizeof(structuser), GFP_KERNEL);

?數(shù)組分配用kmalloc_array/kcalloc:自動檢查n * sizeof(...)溢出,返回NULL避免越界。

3.禁用BUG (),用WARN ()替代

?不要用BUG()/BUG_ON()(會直接崩潰內核),優(yōu)先用WARN_ON_ONCE()(打印警告但不崩潰,且只打印一次)。

?僅在嚴重內存損壞,無法繼續(xù)運行時用BUG(),且需附帶充分理由。

七、工具推薦:自動對齊,告別手動調整

內核開發(fā)有成熟工具鏈,幫你自動符合風格:

1.indent命令:內核推薦indent -kr -i8K&R風格,8字符縮進),或直接用內核腳本scripts/Lindent

2.clang-format:支持自動格式化代碼,還能排序#include、對齊宏定義,配置見Documentation/dev-tools/clang-format.rst

3.編輯器配置

?Emacs:將文檔中的.emacs配置代碼加入,自動適配內核風格;

?Vim:添加set sw=8 ts=8 expandtab!Tab=8字符,不自動轉空格)。

總結:風格的本質是協(xié)作

Linux內核編碼風格看似教條,實則是千萬開發(fā)者協(xié)作的共同語言”——它不追求個性化,而是通過統(tǒng)一規(guī)則降低溝通成本,讓代碼讀起來像一個人寫的

最后記住:風格不是束縛,而是助力。初期可能需要刻意適應,但一旦形成習慣,你的代碼會更易維護、更易被內核社區(qū)接納。

如果在實踐中遇到風格相關的坑,歡迎在評論區(qū)分享~

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    4

    文章

    1467

    瀏覽量

    42869
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219005
  • 編碼
    +關注

    關注

    6

    文章

    1039

    瀏覽量

    56967
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核編碼風格(編程代碼風格推薦)--轉

    。這個問題的答案是,如果需要3級以上的縮進,不管縮進深度如何代碼已經(jīng)有問題了,應該修正
    發(fā)表于 12-02 15:14

    Linux內核編碼風格(編程代碼風格推薦)

    半天沒理解的程序。后來直接用indent -kr -i8給他轉換格式來看了。特此轉過來一個關于代碼風格的帖子分享一下~Linux內核編碼
    發(fā)表于 08-24 09:45

    Linux內核代碼

    Linux內核代碼本章講述在L i n u x內核源碼中,應該從何處開始查找特定的內核函數(shù)。本書并不要求讀者具有C語言編程能力,也不要求讀
    發(fā)表于 02-09 15:24 ?36次下載

    Linux內核代碼漫游

    Linux內核代碼漫游 本章試圖以順序的方式來解釋Linux代碼,以幫助讀者對源代碼的體系
    發(fā)表于 02-09 15:27 ?26次下載

    Linux內核代碼感悟

    直接訪問校內外的 lxr 網(wǎng)站)的。如果在 windows 下也可以用 source insight。以下的當前路徑為內核代碼路徑,通常為/usr/src/linux內核版本為 2
    發(fā)表于 09-11 17:01 ?18次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>代碼</b>感悟

    linux內核C語言的編程風格

    linux 內核C語言的編程風格
    發(fā)表于 09-26 14:22 ?0次下載

    怎樣去讀Linux內核代碼

    怎樣去讀Linux內核代碼
    發(fā)表于 10-25 10:15 ?13次下載
    怎樣去讀<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>源<b class='flag-5'>代碼</b>

    linux內核啟動流程

    Linux的啟動代碼真的挺大,匯編到C,Makefile到LDS文件,需要理解的東西很多。畢竟Linux
    發(fā)表于 11-14 16:19 ?4675次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內核</b>啟動流程

    Linux內核到底是什么應該如何學習

    Linux可以說是近期非常火的了,有的人想學習linux內核,那他到底是什么呢?
    發(fā)表于 10-06 18:02 ?2390次閱讀

    Linux內核的首選代碼風格應該如何設置

    這是一個簡短的文檔,描述了Linux內核的首選代碼風格代碼風格是因人而異的,而且我不愿意把我的
    發(fā)表于 11-04 17:17 ?6次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>的首選<b class='flag-5'>代碼</b><b class='flag-5'>風格</b>應該如何設置

    關于Linux內核代碼風格

    編碼風格錯誤開始 曾經(jīng)在開發(fā)Linux內核驅動的時候,創(chuàng)建了一個補丁文件,但是在把補丁打到主分支的時候提示很多
    的頭像 發(fā)表于 04-25 14:50 ?2441次閱讀

    如何修改Linux內核代碼風格

    編碼風格錯誤開始 快速修改編碼風格的工具 scripts/checkpatch.pl scripts/Lindent astyle
    的頭像 發(fā)表于 05-13 11:27 ?2591次閱讀

    Linux內核的編譯和運行

    Linux內核代碼跑起來,得先搭建編譯和運行代碼的環(huán)境。
    發(fā)表于 06-23 11:56 ?2408次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>的編譯和運行

    Linux內核代碼60%都是驅動?

    為什么Linux內核代碼60%都是驅動? 如果每支持新的設備就加入驅動,內核會不會變得越來越臃腫?
    的頭像 發(fā)表于 07-11 11:48 ?1891次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>代碼</b>60%都是驅動?

    linux內核代碼詳解

     在安裝好的Linux系統(tǒng)中,內核的源代碼位于/ust/src/linux.如果是GNU網(wǎng)站下載的Li
    發(fā)表于 09-06 17:01 ?4次下載