paomian
V2EX  ›  C

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

  •  
  •   paomian · Jun 5, 2014 · 2326 views
    This topic created in 4544 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
    hazard
    Jun 5, 2014
    1
    程序员的自我修养
    YouXia
    YouXia
    Jun 5, 2014 via Android
    2
    适用于全局变量,函数默认是全局变量。
    __attribute__是gcc特有的编译器特性之一。上文是将强符号,转变为弱符号,然后if里的foo初始化为0,如果你把if去掉,应该会产生core dump。

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

    不过这里是弱引用,foo函数没有定义也不会报错。
    Actrace
    Actrace
    Jun 6, 2014
    6
    老是去扣这种地方很容易就掉坑里,或者让别人掉坑里.
    所以我觉得python做的挺好.
    zenliver
    zenliver
    Jun 6, 2014
    7
    @cloveryume 解释的非常好
    ensonmj
    ensonmj
    Jun 7, 2014 via iPad
    8
    glibc里面一堆类似用法
    paomian
    paomian
    OP
    Jun 8, 2014
    9
    @cloveryume 感谢回答,我在https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
    这里是找到了关于weakref的解释,但是,为什么这种函数必须要声明为static呢?
    cloveryume
    cloveryume
    Jun 9, 2014
    10
    @paomian "At present, a declaration to which weakref is attached can only be static." 目前是这样,应该是局限到一个编译单元里,原理不明。一般是弱引用声明写到头文件里,再include进来。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2154 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 101ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    ♥ Do have faith in what you're doing.