深入探索GCC的attribute属性

描述

如果经常看Linux源码,一定会见过 attribute 属性,他在 Linux 里面出现的很多。

attribute 是 gcc 的扩展功能,它不属于标准C语言。

使用 attribute 可以修饰变量、函数或者数据类型的属性,属性有很多,有些确实很有用。

找了几个可以修饰函数的属性,供大家参考下。

如果希望函数可以在 main 函数前面执行,可以用 constructor 属性,就是构造的意思。

如果希望函数可以在 main 函数之后执行,可以用 destrucotr 属性,有点析构的意思。

网上有些介绍使用这两个属性来模拟 C++ 的构造函数和析构函数,说实话,这比 C++ 里面的构造和析构差远了,用它来给程序做些初始化、回收的操作,还是可以的。

第二个,nonnull。

写函数的时候,我们经常对函数做入参判断,比如防止传进来的参数是空指针,导致程序下面出现异常。

使用 nonnull 属性,可以让编译器来判断。如果传进来的参数是 NULL,编译的时候会提示警告,非常的人性化。

第三个,deprecated。

如果想把某个函数废弃掉,比如在项目的后续版本中不再使用,可以使用 deprecated 属性,加上这个属性,如果你还是使用这个函数,编译就会提示警告。

比如常见的 gets 函数,如果一下子把它从标准库中删掉,对以前的程序不够友好,所以只能提醒。

第四个,noreturn。

对于不会返回的函数,可以使用 noreturn 属性。注意,返回值是 void 类型和函数不返回是两码事,这样的代码编译会提示警告。

如果在函数内部加上死循环或者退出,这样的函数才属于不返回。

第五个,weak,用于定义弱函数。

比如在一个文件中定义了弱函数,另一个文件完全可以重新再定义一遍,并且编译器会自动链接到用户定义的新函数上。

weak 属性在 STM32 上面出现的很多,比如中断函数等等。

gcc 扩展的属性很多,打开 gcc 文档,粗略的估算了一下,可能有百来个。

可能是C语言也发现了这些属性好用,在最新的C23标准里面,也加入了属性这个概念,不过用法很奇葩,使用两个嵌套的中括号,而且目前支持的属性也比较少。

编译器一直都是走在标准的前面,也许在接下来的某个C语言标准中,会有更多的 gcc 属性加入到C语言中。
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分