__attribute__基本介绍:
1. __attribute__ 可以设置函数属性、变量属性和类型属性。
2. __attribute__ 语法格式为:__attribute__ ((attribute-list))
attribute-list为相应的__attribute__参数,常见的有 aligned、packed、noreturn
3. __attribute__的放置位置为 申明的尾部 即";" 之前。
4. 在使用__attribute__ 参数时,你也可以在参数的前后都
加上“__” (两个下划线),例如,使用__aligned__而不
是aligned ,这样,你就可以在相应的头文件里使用它而不
用关心头文件里是否有重名的宏定义。
常用参数介绍(在32位Ubuntu系统上测试):
1. aligned
该属性设定一个指定大小的对齐格式(以字节为单位):
struct foo {
short s;
}__attribute__((aligned(8)));
以上申明将要求编译器确保struct foo类型在空间分配时以8字节对齐方式。
sizeof(short)大小为2,在未加__attribute__((aligned(8)))限制是此结构体大小为2,加了后,要求8字节对齐则大小变为8。
由上述还可得知,我们可以自己手动指定要对齐的字节数。
2. packed:
aligned 属性使被设置的对象占用更多的空间,相反的,使用packed 可以减小对象占用的空间。它将结构体中的每个数据结合在一起。
struct foo
{
short s;
char c;
}__attribute__((packed));
sizeof(short)大小为2,sizeof(char)大小为1,在未加__attribute__((packed))限制时此结构体大小为4,加了后,要求每个数据结合在一起则大小变为3,减小了储存空间。
3. noreturn:
该属性通知编译器函数从不返回值,当遇到类似函数需要返
回值而却不可能运行到返回值处就已经退出来的情况,该属
性可以避免出现错误信息。C库函数中的abort()和exit()
的声明格式就采用了这种格式,如下所示:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));
举例:
void func_1() {
printf("author-->Flying\n");
}
extern void func_1();
int func_2(int n) {
if (n > 0) {
func_1();
} else {
return 0;
}
}
编译时会出一个警告:
warning: control reaches end of non-void function
警告信息也很好理解,因为你定义了一个有返回值的函数
func_2却有可能没有返回值,程序当然不知道怎么办了!
加上__attribute__((noreturn))则可以很好的处理
类似这种问题。
解决方法:
extern void func_1() __attribute__((noreturn));
之后,编译不会再出现警告信息
参考文档:
http://www.cnblogs.com/astwish/articles/3460618.html