原文: http://blog.csdn.net/wavemcu/article/details/43890305
*****************************************************************************************************************************
作者:EasyWave 时间:2015.02.20
类别:Linux应用-GCC编译器的内部预宏定义与__attribute__属性 声明:转载,请保留链接
注意:如有错误,欢迎指正。这些是我学习的日志文章......
*****************************************************************************************************************************
一:Linux下的GCC编译器内部预宏定义
经常在一些开源的程序中看到一些宏定义,却看不到这些宏定义是在哪些地方定义的,其实有些宏定义是交叉编译工具GCC预定义好的,比如:__GNUC__,__ELF__等等,怎么看到这些宏定义呢,可以采用以下命令来查看的,还是现在看看一些程序中的预先宏定义代码吧,如下所示:
怎么来查看到这些预宏定义呢,可以采用gcc -E -dM - </dev/null 命令来查看的如下所示:
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之间的符号冲突。
版权声明:本文为博主原创文章,未经博主允许不得转载。
======================总结======================
1.怎么查看域定义的宏
gcc -E -dM - </dev/null