1
hazard 2014-06-05 22:23:02 +08:00
程序员的自我修养
|
2
YouXia 2014-06-05 22:39:40 +08:00 via Android
适用于全局变量,函数默认是全局变量。
__attribute__是gcc特有的编译器特性之一。上文是将强符号,转变为弱符号,然后if里的foo初始化为0,如果你把if去掉,应该会产生core dump。 具体什么时候使用,我不知道,从来没用过,平常很少使用,涉及到链接方面东西,《程序员的自我修养》里看过。 |
3
leavic 2014-06-05 23:38:00 +08:00
我记得好像这个有点类似C++的重构,一些标准库函数会用weak属性,从而允许你自己重写这个库函数.
如果编译时加入fno-builtin参数,就不会链接库里的函数,而是用你自己写的同名函数替换这个库里面内置的函数. |
4
leavic 2014-06-05 23:39:33 +08:00
嗯,好像带weak属性的,不需要加fno-builtin也会被用户自己写的代码替换,具体不记得了,反正我在单片机上改写printf是这样搞的.
|
5
cloveryume 2014-06-06 09:26:35 +08:00 1
c语言里函数和已初始化的全局变量是强符号,
未初始化的全局变量是弱符号。 强符号不允许重复。 不过这里是弱引用,foo函数没有定义也不会报错。 |
6
Actrace 2014-06-06 11:48:23 +08:00
老是去扣这种地方很容易就掉坑里,或者让别人掉坑里.
所以我觉得python做的挺好. |
7
zenliver 2014-06-06 18:16:42 +08:00
@cloveryume 解释的非常好
|
8
ensonmj 2014-06-07 22:21:20 +08:00 via iPad
glibc里面一堆类似用法
|
9
paomian OP @cloveryume 感谢回答,我在https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
这里是找到了关于weakref的解释,但是,为什么这种函数必须要声明为static呢? |
10
cloveryume 2014-06-09 09:26:26 +08:00
@paomian "At present, a declaration to which weakref is attached can only be static." 目前是这样,应该是局限到一个编译单元里,原理不明。一般是弱引用声明写到头文件里,再include进来。
|