__attribute__ 机制详解
__attribute 语法的来源
GNU C 的一大特色就是__attribute__ 机制。attribute 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
其位置约束为: 放于声明的尾部“;” 之前
attribute 书写特征为: attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。
当__attribute__ 用于修饰对象时,它就如同C 语言语法体系结构的类型限定符,跟const , volatile , restrict 等属一类。
当__attribute__ 用于修饰函数时,它就相当于一个函数说明符,跟inline,Noreturn 属同一类。
当__attribute_ 用于修饰一个结构体,联合体或者枚举类型,该限定符只能放在类型标识符之前。
__attribute 所支持的类型
当我们需要识别当前编译器能否支持GNU 语法拓展,我们可以使用 __GNU __ 宏作为区分.
常用函数属性
attribute((Noreturn)) function attribute
表示没有返回值
这个属性告诉编译器函数不会返回,这可以用来抑制关于未达到代码路径的错误。 C库函数abort()和exit()都使用此属性声明:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));
attribute((always_inline)) function attribute
对于声明为内联的函数,会强制优化。所有加了attribute((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内。
attribute((noinline)) function attribute
与上面的相反,声明为非内联函数。
attribute((pure)) function attribute
用pure属性修饰的函数用来说明该函数除了返回值之外没有其他任何 效果,并且该函数所返回的值仅仅依赖于函数的形参以及/或全局对象。用 pure属性所修饰的函数可以用来辅助编译器做消除公共子表达式以及帮助 做循环优化,使用这种函数就好比使用算术操作符一般。
用pure属性所修饰的函数体内不应该含有无限循环,不应该对volatile 修饰的全局对象进行访问或是对多个线程所共享的全局对象进行访问,也不应该访问其他系统资源,比如对文件、套接字等进行操作。简而言之, 对同一个使用pure属性修饰的函数连续做两次调用(如果该函数带有参 数,那么两次调用应该用同样的实参),那么这两次调用所返回的结果应 该始终是相同的。因此,用pure属性所修饰的函数也很容易让编译器做内 联处理。
attribute((section(“name”))) function attribute
attribute((section(“name”))) 其作用是将作用的函数或数据放入指定名为"section_name"对应的段中.
static void __attribute((section("__TEXT,MySection" ))) myFun1(void){
print("");
}