[英]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.