跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 偷懒是人类进步的阶梯,请问大佬们 C 如何运行时生成函数指针
未分類
22 11 月 2020

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

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

資深大佬 : HHPLow 3

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

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

大佬有話說 (19)

  • 資深大佬 : lcdtyph

    我觉得你连需求都没描述清楚……

    盲建议个跳转表吧

  • 資深大佬 : Ediacaran

    想要柯里化还是闭包?

    C 里面都没有常规能实现的方法

  • 資深大佬 : ETiV

    https://zh.wikipedia.org/wiki/%E5%8F%8D%E5%B0%84_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)#.E4.BE.8B.E5.AD.90

  • 資深大佬 : Tony042

    函数重载?

  • 主 資深大佬 : HHPLow

    @ETiV 多谢!之前不明白反射是个啥现在知道了

  • 資深大佬 : irytu

    不太明白你的描述 不过运行时打桩了解一下 查一下 LD_PRELOAD 这个环境变量 封装一下你真正关心的函数

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

    “`
    func(A, B)
    {
    func_a1_b2();
    }
    “`

  • 資深大佬 : elfive

    @ETiV #3 这是 SMC ( self-modifying code )吧

  • 資深大佬 : ysc3839

    意思是通过函数名称的字符串,调用对应函数?这个必须建个表才能实现。

  • 資深大佬 : heqing

    可以参考一下 Windows 平台下 MFC 消息映射的实现方式, 通过宏定义将常量映射到函数调用.

  • 資深大佬 : DoctorCat

    支持 @heqing 的建议。通过宏定义是最简单的方式了,不过不适用于 runtime 阶段。

  • 資深大佬 : oahebky

    《 head first C 》「函数指针」一节可以看一下。

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

    或许是你想实现的。

  • 資深大佬 : no1xsyzy

    根据参数修改实际调用函数?
    这个 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

    dlopen dlsym
    loadlibrary getprocessaddress

    “运行时获得函数地址” 只有这种办法
    其它的都只是编译期把地址存到固定地方而已

  • 資深大佬 : felixin

    这就是多态,触摸到软件工程的边了

  • 資深大佬 : GeruzoniAnsasu

    *getprocaddress

    或者可以用宏来自动给新加的函数增加额外注册逻辑

  • 資深大佬 : Maboroshii

    写一个脚本来生成初始化的部分就省事了吧。

    http 服务的路由也是这个啊,识别 uri,然后调用对应的方法去处理请求。 方向都差不多,只是实现细节不一样

  • 資深大佬 : neighbads

    上大佬可能都没说到点子上,可以了解下 libffi 不但函数名可以运行时指定,连参数都可以。很多库和语言实现跨语言调用都是用的这个

  • 資深大佬 : Vibra

    可是 C 是不支持反射的呀…

  • 資深大佬 : dzmcs

    要么静态的指定函数指针表,要么动态加载。你用 switch 都可以,那就说明可以用函数指针的表,func 里 dispath

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具