今天看了一下,在 c 中有弱符号之说。

2014-06-05 22:13:51 +08:00
 paomian
__attribute__ ((weakref)) void foo();

int main()
{
if(foo) foo();
}
这种写法,自己用clang编译是报错的,但gcc是不会报错的。想问一下这种用法在什么样的地方用呢?
1340 次点击
所在节点    C
10 条回复
hazard
2014-06-05 22:23:02 +08:00
程序员的自我修养
YouXia
2014-06-05 22:39:40 +08:00
适用于全局变量,函数默认是全局变量。
__attribute__是gcc特有的编译器特性之一。上文是将强符号,转变为弱符号,然后if里的foo初始化为0,如果你把if去掉,应该会产生core dump。

具体什么时候使用,我不知道,从来没用过,平常很少使用,涉及到链接方面东西,《程序员的自我修养》里看过。
leavic
2014-06-05 23:38:00 +08:00
我记得好像这个有点类似C++的重构,一些标准库函数会用weak属性,从而允许你自己重写这个库函数.
如果编译时加入fno-builtin参数,就不会链接库里的函数,而是用你自己写的同名函数替换这个库里面内置的函数.
leavic
2014-06-05 23:39:33 +08:00
嗯,好像带weak属性的,不需要加fno-builtin也会被用户自己写的代码替换,具体不记得了,反正我在单片机上改写printf是这样搞的.
cloveryume
2014-06-06 09:26:35 +08:00
c语言里函数和已初始化的全局变量是强符号,
未初始化的全局变量是弱符号。
强符号不允许重复。

不过这里是弱引用,foo函数没有定义也不会报错。
Actrace
2014-06-06 11:48:23 +08:00
老是去扣这种地方很容易就掉坑里,或者让别人掉坑里.
所以我觉得python做的挺好.
zenliver
2014-06-06 18:16:42 +08:00
@cloveryume 解释的非常好
ensonmj
2014-06-07 22:21:20 +08:00
glibc里面一堆类似用法
paomian
2014-06-08 12:42:29 +08:00
@cloveryume 感谢回答,我在https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
这里是找到了关于weakref的解释,但是,为什么这种函数必须要声明为static呢?
cloveryume
2014-06-09 09:26:26 +08:00
@paomian "At present, a declaration to which weakref is attached can only be static." 目前是这样,应该是局限到一个编译单元里,原理不明。一般是弱引用声明写到头文件里,再include进来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/116008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX