基于Linux下的GCC编译器的内部预宏定义与__attribute__属性

*****************************************************************************************************************************
作者:EasyWave                                                                                    时间:2015.02.20

类别:Linux应用-GCC编译器的内部预宏定义与__attribute__属性    声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

*****************************************************************************************************************************

一:Linux下的GCC编译器内部预宏定义

       经常在一些开源的程序中看到一些宏定义,却看不到这些宏定义是在哪些地方定义的,其实有些宏定义是交叉编译工具GCC预定义好的,比如:__GNUC__,__ELF__等等,怎么看到这些宏定义呢,可以采用以下命令来查看的,还是现在看看一些程序中的预先宏定义代码吧,如下所示:

基于Linux下的GCC编译器的内部预宏定义与__attribute__属性_第1张图片

       怎么来查看到这些预宏定义呢,可以采用gcc -E -dM -

root@ubuntu:~$ gcc -E -dM - 
        而在嵌入式Linux下的交叉编译GCC中也是可以采用这样的命令来查看的,比如:arm-linux- gcc -E -dM -
root@ubuntu:~$ arm-linux-gcc -E -dM - 

二:GCC attribute机制

        GNU C的一大特色就是__attribute__机制。GNU C扩展的__attribute__ 机制被用来设置函数属性(Function   Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。

        __attribute__语法格式为:__attribute__((attribute-list))

        其位置约束为: 放于声明的尾部“:”之前。

        函数属性(FunctionAttribute) 

        函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。 

        一个实际的例子是,动态库中有些函数的可见性,可以通过visibility来设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见。
        GNU C在编译时,可用参数-fvisibility指定所有符号的可见性(不加此参数时默认外部可见);若需要对特定函数的可见性进行设置,需在代码中使用__attribute__设置visibility属性。
        编写大型程序时,可用-fvisibility=hidden设置符号默认隐藏,针对特定变量和函数,在代码中使用__attribute__ ((visibility("default")))另该符号外部可见,这种方法可用有效避免so之间的符号冲突。

你可能感兴趣的:(Linux应用)