gcc 提供一種「定義函數屬性(attribute)」的語法,也就是前一篇日記我們所提到的 __attribute__ 標籤。__attribute__ 用來讓我們定義函數的行為,以便告訴 gcc 在編譯時期對此函數做一些特殊的處理或檢查動作。
以 asmlinkage 的例子來說,asmlinkage 的定義是(/usr/include/linux/linkage.h):
#if defined __i386__ #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) #elif defined __ia64__ #define asmlinkage CPP_ASMLINKAGE __attribute__((syscall_linkage)) #else #define asmlinkage CPP_ASMLINKAGE #endif
由此可知,以 sys_nice() 的原型宣告來說,以下的二行程式碼是等價的:
asmlinkage sys_nice(...); __attribute__((regparm(0))) sys_nice();
"__attribute__" 寫在函數宣告之前或之後都可以(左括號前或右括號後),並接著使用一對「雙括號」來註明此函數的屬性。語法:
__attribute__((keywords)) functon_name(...);
屬性的關鍵字如下(節錄自 gcc 3.4.6 manual):
noreturn,noinline, always_inline, pure, const, nothrow, format, format_arg, no_instrument_function, section, constructor, destructor, used, unused, deprecated, weak, malloc,alias, warn_unused_result, nonnull.
regparm 的用法與用途
regparm 的語法是:regparm(number),regparm 屬性只在 Intel 386 平臺上有作用,用來指定最多可以有多少個("number" )參數(arguments)能以暫存器來傳遞,regparm(0) 表示參數都不能透過暫存器來傳遞,因此所有參數都會透過堆疊來傳遞。
更多關於__attribute__
又如,在 ARM 平臺上宣告 "__attribute((interrupt))" 表示此函數是一個 interrupt handler。
其它的屬性說明可參閱 gcc 的手冊。
__attribute__ 是重要的 gcc 用法,對系統程式(system software)的開發尤其重要,應仔細閱讀 gcc 手冊。
Also See |
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw