__attribute__ ((weakref)) void foo();
int main()
{
if(foo) foo();
}
这种写法,自己用clang编译是报错的,但gcc是不会报错的。想问一下这种用法在什么样的地方用呢?
int main()
{
if(foo) foo();
}
这种写法,自己用clang编译是报错的,但gcc是不会报错的。想问一下这种用法在什么样的地方用呢?

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