GNU C中__attribute__

本文详细介绍了GCC中的__attribute__特性,包括其基本语法、常见参数及其应用场景。通过具体示例展示了如何利用aligned属性实现数据对齐优化,使用packed属性减少结构体占用空间,以及通过noreturn属性提高函数调用的安全性。
__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
__attribute__是一个编译属性,用于向编译器描述特殊的标识、错误检查或高级优化。它是GNU C的一个特性,可以用于设置函数属性、变量属性和类型属性等。在给函数、变量或类型添加属性时,可以使用__attribute__来指定属性列表。例如,可以使用__attribute__((constructor))来在main函数执行之前执行某个函数,使用__attribute__((destructor))来在main函数执行之后执行某个函数。\[1\]这些属性可以用于实现一些特殊的功能或行为,比如在程序运行前后执行一些初始化或清理操作。在给函数、变量或类型添加属性时,需要按照特定的格式来设置,比如使用__attribute__((attr_list))的形式来指定属性列表。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [C语言attribute机制](https://blog.youkuaiyun.com/weixin_37867857/article/details/102940773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言再学习 -- __attribute__详解](https://blog.youkuaiyun.com/qq_29350001/article/details/129390465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值