GNU C中__attribute__

__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)大小为2sizeof(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值