關於 gcc 的 __attribute__ 用法

jollen 發表於 October 27, 2006 12:02 AM

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