V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
paomian
V2EX  ›  C

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

  •  
  •   paomian · 2014-06-05 22:13:51 +08:00 · 1314 次点击
    这是一个创建于 3830 天前的主题,其中的信息可能已经有所发展或是发生改变。
    __attribute__ ((weakref)) void foo();

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

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

    不过这里是弱引用,foo函数没有定义也不会报错。
    Actrace
        6
    Actrace  
       2014-06-06 11:48:23 +08:00
    老是去扣这种地方很容易就掉坑里,或者让别人掉坑里.
    所以我觉得python做的挺好.
    zenliver
        7
    zenliver  
       2014-06-06 18:16:42 +08:00
    @cloveryume 解释的非常好
    ensonmj
        8
    ensonmj  
       2014-06-07 22:21:20 +08:00 via iPad
    glibc里面一堆类似用法
    paomian
        9
    paomian  
    OP
       2014-06-08 12:42:29 +08:00
    @cloveryume 感谢回答,我在https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
    这里是找到了关于weakref的解释,但是,为什么这种函数必须要声明为static呢?
    cloveryume
        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进来。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:49 · PVG 03:49 · LAX 11:49 · JFK 14:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.