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

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

  •  
  •   paomian Jun 5, 2014 1966 views
    This topic created in 4362 days ago, the information mentioned may be changed or developed.
    __attribute__ ((weakref)) void foo();

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

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

    不过这里是弱引用,foo函数没有定义也不会报错。
    Actrace
        6
    Actrace  
       Jun 6, 2014
    老是去扣这种地方很容易就掉坑里,或者让别人掉坑里.
    所以我觉得python做的挺好.
    zenliver
        7
    zenliver  
       Jun 6, 2014
    @cloveryume 解释的非常好
    ensonmj
        8
    ensonmj  
       Jun 7, 2014 via iPad
    glibc里面一堆类似用法
    paomian
        9
    paomian  
    OP
       Jun 8, 2014
    @cloveryume 感谢回答,我在https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
    这里是找到了关于weakref的解释,但是,为什么这种函数必须要声明为static呢?
    cloveryume
        10
    cloveryume  
       Jun 9, 2014
    @paomian "At present, a declaration to which weakref is attached can only be static." 目前是这样,应该是局限到一个编译单元里,原理不明。一般是弱引用声明写到头文件里,再include进来。
    About     Help     Advertise     Blog     API     FAQ     Solana     3027 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 08:46 PVG 16:46 LAX 01:46 JFK 04:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86