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

求问 C 函数怎么被自动调用

  •  
  •   Earl · 2018-12-24 14:52:47 +08:00 · 2670 次点击
    这是一个创建于 2153 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 C++里面,某个类的全局对象的构造函数,可以被自动调用。
    C 里面有没有什么办法可以让一个函数被自动调用啊?谢谢
    22 条回复    2018-12-25 16:35:25 +08:00
    xenme
        1
    xenme  
       2018-12-24 14:54:42 +08:00
    那只是 C++语言的特性帮你调用了而已。
    C 没有类似的特性。
    catror
        2
    catror  
       2018-12-24 15:01:03 +08:00 via Android
    可以了解一下 gcc 的 constructor
    zyp0921
        3
    zyp0921  
       2018-12-24 15:05:30 +08:00
    static void __attribute__((constructor(112))) __reg_srv_name_service()
    {

    }
    Earl
        4
    Earl  
    OP
       2018-12-24 15:08:31 +08:00
    @catror

    @zyp0921

    谢谢你们,gcc 下可以这样解决。那 VS 的编译器下,有好办法吗?
    ysc3839
        5
    ysc3839  
       2018-12-24 15:20:48 +08:00 via Android
    @Earl 用 C++ 写个对象调用吧?
    Earl
        6
    Earl  
    OP
       2018-12-24 15:35:01 +08:00
    @ysc3839 不能用 C++呃。。。能用 C++就简单了
    ysc3839
        7
    ysc3839  
       2018-12-24 15:37:20 +08:00 via Android
    @Earl 说一下你的用途吧,看看有没有替代方案。
    across
        8
    across  
       2018-12-24 15:41:58 +08:00
    你该说清楚在什么情况下触发调用。
    说是自动调用,都是有触发器的啊。
    Earl
        9
    Earl  
    OP
       2018-12-24 16:52:06 +08:00
    @ysc3839
    @across
    类似全局类对象的构造函数,或者上面有朋友提到的__attribute__((constructor)),就是定义在 main 函数外,在程序启动后也能被自动调用
    wevsty
        10
    wevsty  
       2018-12-24 17:01:24 +08:00
    不是很明白为什么要有这样的需求。

    要求在程序在启动的时候执行个函数那直接在 mian 函数里面调用不就行了?干嘛要舍近求远?
    shuax
        11
    shuax  
       2018-12-24 17:15:33 +08:00
    http://cpp.sh/43i34
    手动调用行不行
    wizardoz
        12
    wizardoz  
       2018-12-24 17:18:30 +08:00
    写代码的过程不就是创造自动化的过程吗?
    zhujinliang
        13
    zhujinliang  
       2018-12-24 17:21:01 +08:00 via iPhone
    用宏包装一下?
    ysc3839
        14
    ysc3839  
       2018-12-24 17:21:38 +08:00 via Android
    @Earl 问的是为什么要自动调用,要自动调用来实现什么?
    shuax
        15
    shuax  
       2018-12-24 17:34:58 +08:00
    deanzh16
        16
    deanzh16  
       2018-12-24 17:41:47 +08:00 via Android
    Try lambda ?
    static int x = [ ]( ) { foo(); return 0; }( );
    deanzh16
        17
    deanzh16  
       2018-12-24 17:43:02 +08:00 via Android
    @deanzh16 哦 是 C sorry
    ChrisTsai
        18
    ChrisTsai  
       2018-12-24 17:47:56 +08:00
    @ysc3839 #14 估计是类似于 linux 内核 module_init 的作用。
    据我所知,module_init 就是采用楼上所说的 gcc 的 constructor,至于 VS 下就不太清楚了。。
    要不尝试一下 MinGW 编译?
    Earl
        19
    Earl  
    OP
       2018-12-25 14:50:01 +08:00
    @wevsty
    @shuax
    @wizardoz
    @ysc3839
    例如写一个注册函数接口,需要用户在写具体的业务代码前就注册好。如果可以自动执行,用户在写自己的 main 函数的话,就不用关心这个注册了呀。不然要提醒用户一定要提前注册,万一忘了多麻烦。而且让用户调用,也可能会多次注册之类的。
    Earl
        20
    Earl  
    OP
       2018-12-25 14:51:49 +08:00
    @shuax 这个在 c 下面编不过吧。。。
    wevsty
        21
    wevsty  
       2018-12-25 16:15:02 +08:00
    @Earl
    C 标准没有这样的方法,与其你用奇奇怪怪的技巧来适配各个平台,不如直接文档写明白点。
    很多库要初始化是很常见的做法,文档写好就行了。
    Earl
        22
    Earl  
    OP
       2018-12-25 16:35:25 +08:00
    @wevsty 恩,没有好办法的话,就只能给文档了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2903 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:36 · PVG 14:36 · LAX 22:36 · JFK 01:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.