HHPLow
V2EX  ›  C

偷懒是人类进步的阶梯,请问大佬们 C 如何运行时生成函数指针

  •  
  •   HHPLow · Nov 23, 2020 · 4671 views
    This topic created in 2171 days ago, the information mentioned may be changed or developed.

    有两个函数的参数 A,B 我想在调用 func(A, B)时候, 自动调用到 func_a1_b2(); 或者 func_a2_b2();

    之前拿 switch case 做,写了半天发现太蠢了... 求大佬们指教。

    19 replies  •  2020-11-24 10:59:21 +08:00
    lcdtyph
    lcdtyph
    Nov 23, 2020❤️3
    1
    我觉得你连需求都没描述清楚……

    盲建议个跳转表吧
    Ediacaran
    Ediacaran
    Nov 23, 2020 via iPhone
    2
    想要柯里化还是闭包?

    C 里面都没有常规能实现的方法
    Tony042
    Tony042
    Nov 23, 2020
    4
    函数重载?
    HHPLow
    HHPLow
    OP
    Nov 23, 2020 via iPhone
    5
    @ETiV 多谢!之前不明白反射是个啥现在知道了😂

    的确就是想按照名称反射一个函数出来,我朝着这个方向找找。

    @lcdtyph 多谢! 也是能实现的,但是好像还要维护一个表,有点麻烦
    irytu
    irytu
    Nov 23, 2020
    6
    不太明白你的描述 不过运行时打桩了解一下 查一下 LD_PRELOAD 这个环境变量 封装一下你真正关心的函数

    不确定是不是你需要的这种

    ```
    func(A, B)
    {
    func_a1_b2();
    }
    ```
    elfive
    elfive
    Nov 23, 2020 via iPhone
    7
    @ETiV #3 这是 SMC ( self-modifying code )吧
    ysc3839
    ysc3839
    Nov 23, 2020 via Android
    8
    意思是通过函数名称的字符串,调用对应函数?这个必须建个表才能实现。
    heqing
    heqing
    Nov 23, 2020
    9
    可以参考一下 Windows 平台下 MFC 消息映射的实现方式, 通过宏定义将常量映射到函数调用.
    DoctorCat
    DoctorCat
    Nov 23, 2020
    10
    支持 @heqing 的建议。通过宏定义是最简单的方式了,不过不适用于 runtime 阶段。
    oahebky
    oahebky
    Nov 23, 2020 via Android
    11
    《 head first C 》「函数指针」一节可以看一下。

    通过数组和函数指针的映射“初始化”好了之后可以一行代码调用不同函数;不用写一堆判断。

    或许是你想实现的。
    no1xsyzy
    no1xsyzy
    Nov 24, 2020
    12
    根据参数修改实际调用函数?
    这个 SICP 第一章两段代码实现了一个非常基础的跳转表,然后两笔带过了,然而就是这两段代码,稍微再扩充一倍代码量就是一个 multi-dispatcher……

    不过,简单的话,如果你的伪代码是这样的:
    func(A,B)(C) =>
    if A==1 and B==1 then
    func_a1_b1(C)
    else if A==2 and B==2 then
    func_a2_b2(C)
    end

    那可以用 hashmap 来实现
    函数指针不需要运行时生成,静态生成,运行时保存进 hashmap 就行
    GeruzoniAnsasu
    GeruzoniAnsasu
    Nov 24, 2020
    13
    dlopen dlsym
    loadlibrary getprocessaddress


    “运行时获得函数地址” 只有这种办法
    其它的都只是编译期把地址存到固定地方而已
    felixin
    felixin
    Nov 24, 2020 via Android
    14
    这就是多态,触摸到软件工程的边了
    GeruzoniAnsasu
    GeruzoniAnsasu
    Nov 24, 2020
    15
    *getprocaddress

    或者可以用宏来自动给新加的函数增加额外注册逻辑
    Maboroshii
    Maboroshii
    Nov 24, 2020
    16
    写一个脚本来生成初始化的部分就省事了吧。

    http 服务的路由也是这个啊,识别 uri,然后调用对应的方法去处理请求。 方向都差不多,只是实现细节不一样
    neighbads
    neighbads
    Nov 24, 2020 via Android
    17
    楼上大佬可能都没说到点子上,可以了解下 libffi 不但函数名可以运行时指定,连参数都可以。很多库和语言实现跨语言调用都是用的这个
    Vibra
    Vibra
    Nov 24, 2020
    18
    可是 C 是不支持反射的呀...
    dzmcs
    dzmcs
    Nov 24, 2020
    19
    要么静态的指定函数指针表,要么动态加载。你用 switch 都可以,那就说明可以用函数指针的表,func 里 dispath
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5063 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 03:48 · PVG 11:48 · LAX 19:48 · JFK 22:48
    ♥ Do have faith in what you're doing.