如果经常看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语言中。
全部0条评论
快来发表一下你的评论吧 !