Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593485
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类:

2011-12-08 13:16:56

原文地址:關於 gcc 的 __attribute__ 用法 作者:CUDev

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 手冊。

阅读(415) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~