gcc weak/alias/weakref/__typeof()属性总结

今早偶尔看了一些关于linux socket源码的东西,发现socket在编写过程中大量利用了gcc的扩展功能,现就weak/alias/weakref/__typeof()的使用方法及特点做一简单总结。

1. 弱符号 weak

在gcc中全局函数或已初始化的全局变量属于强符号,在链接时如果存在多个强符号则会出现重定义错误。弱符号则是相对于强符号而言,主要指未初始化的全局变量或通过__attribute__((weak))来显式申明的变量或函数。通过对于强弱符号的分析我们可以知道,若要定义弱符号则需要借助gcc扩展:__attribute__((weak))。现就以上扩展的特点做详细分析。

  1. 链接时强弱符号都存在时以强符号为准;
  2. 链接时如果只有弱符号时以弱符号为准;
  3. 若弱符号仅声明未定义,则链接时不会报未定义错误,但在运行过程中会出现段错误;
  4. 弱符号还有一个规则,就是两个都是弱符号时,以内存占用大小较大的那个符号为准。
把我参考的网址也发给大家: http://www.myexception.cn/cpp/1957807.html

2. 别名 alias

这一属性非常简单,就是给函数起了一个别名。

对于alias的描述请见上一篇blog。

3.  弱引用  weakref

weakref就是声明某个引用为弱引用,弱引用时如果需引用符号不存在也不会链接出错,而是将需要引用的符号定义为WEAK属性及0地址。需要注意的是weakref必须要配合alias使用及必须是static定义。weakref与alias的区别在于如果原函数不存在时声明alias会出错,通过weakref方法,可以让func未定义就可以编译通过。

4. __typeof()

通过字面意思就可以了解个大概,typeof可以获得表达式或类型的类型,typeof的结果主要可以用于定义函数或变量。

具体内容可参考一下blog。

http://blog.chinaunix.net/uid-28458801-id-4200573.html


你可能感兴趣的:(gcc扩展)