簡體   English   中英

__devexit在函數聲明中的含義是什么?

[英]What does __devexit mean in a function declaration?

我看過一個司機

static void __devexit rtsx_remove(struct pci_dev *pci)

__devexit在函數定義的上下文中意味着什么? 我見過的其他函數最多只有static和return類型。

長篇故事:

這是一個擴展為一組gcc 屬性的宏。 它們是為編譯器提供有關代碼中各種內容的特殊信息的一種方式,例如,在這種情況下,是一個函數。

不同的編譯器為此目的具有不同的語法,它不是標准化的。 例如,gcc使用屬性,但其他編譯器使用不同的構造。

長篇故事長篇大論:

所以,我不是Linux內核專家,但從源代碼判斷,這個宏用於Hotplug 我相信它表示該功能應該與特定設備退出做一些事情。

例如,您提供的功能似乎來自用於使用Realtek PCI-Express讀卡器驅動程序的Hotplug功能集。

這個宏實際上做了什么? 那么,讓我們仔細看看宏的定義:

#define __devexit        __section(.devexit.text) __exitused __cold

第一部分是__section(.devexit.text)

# define __section(S) __attribute__ ((__section__(#S)))

如您所見,這將創建一個__attribute__(__section__()) ,其節名稱為".devexit.text" 這意味着gcc會將具有此屬性的函數的匯編代碼編譯為編譯二進制文件中名為.devexit.text (而不是默認部分)的命名部分。

第二部分是__exitused (僅在定義MODULE宏時定義為某些內容):

#define __exitused  __used

__used是,取決於gcc版本,定義如下:

# define __used                 __attribute__((__used__))

或者像這樣:

# define __used                 __attribute__((__unused__))

前者確保編譯具有此屬性的函數,即使它未在任何地方引用。 后者在相同的情況下抑制編譯器警告,盡管它不會以任何方式影響編譯。

最后, __cold

#define __cold                  __attribute__((__cold__))

這是一個屬性,通知編譯器具有此屬性的函數不會經常被調用,因此可以相應地進行優化。

那么,我們到底有什么? 看起來像__devexit標記的函數只是經常不被調用的函數 (如果被調用的話),並且被填充到命名的部分中。

所有的源代碼都來自這里 看起來宏現在已經從Linux內核中刪除了

“......很可能只是一個注釋......” - 巴拉克馬諾斯

找到了! 事實證明,神秘元素可能被稱為注釋 ,它添加了有關函數的額外信息。 編譯器可以檢查這些額外的信息,以捕獲可能會被忽視的錯誤。

編輯:@MattMcNabb說它不是注釋。 增加不確定性

這些屬性在Linux內核中用於某些驅動程序函數和數據聲明,將它們放在一個單獨的部分中,在某些情況下可以丟棄它們。

但是,從3.10.x開始不再使用(或定義)它們。 請參閱: https//git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id = 54b956b903607

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM