【问题标题】:How one can achieve late binding in C language?如何在 C 语言中实现后期绑定?
【发布时间】:2010-01-18 11:27:18
【问题描述】:

如何用C语言实现后期binding

【问题讨论】:

  • 如何使用函数指针数组。然后我们可以根据用户输入从数组中选择函数指针

标签: c binding dynamic-linking


【解决方案1】:

后期绑定实际上并不是 C 语言本身的功能,更多的是您的执行环境为您提供的功能。

许多系统将提供延迟绑定作为链接器/加载器的功能,您还可以使用显式调用,例如dlopen(打开共享库)和dlsym(获取其中的符号地址库,以便您可以访问或调用它)。

获得与 C 标准的后期绑定的唯一半便携方法是对 system() 使用一些技巧,即使这至少是部分特定于实现的。

如果您不是在谈论延迟绑定而是在谈论多态,那么您可以使用函数指针来实现该效果。基本上,您创建一个struct,其中包含一个类型的所有数据以及用于定位该类型方法的函数指针。然后,在 "constructor"(通常是一个 init() 函数)中,将函数指针设置为该类型的相关函数。

即使你不使用它,你仍然需要包含所有代码,但是可能以这种方式获得多态性。

【讨论】:

    【解决方案2】:

    C 中的符号绑定总是在编译时完成,而不是运行时。

    库绑定或所谓的动态链接是通过 *nix 上的 dlopen()dlsym() 以及 Windows 上的 LoadLibrary()GetProcAddress() 完成的。

    【讨论】:

      【解决方案3】:

      如何在 C 语言中实现后期绑定?

      最接近的是通过动态加载库 (DLL),例如在 Linux 上使用 dlopendlsym。否则在C中是不直接可用的。

      【讨论】:

        【解决方案4】:

        使用 Objective-C 或 Lua。两者都是后期绑定语言,可以轻松与 C 交互。

        当然您可以实现自己的名称解析方案,但为什么要重新发明轮子呢?

        【讨论】:

          【解决方案5】:

          很遗憾,您没有指定操作系统。对于 Unix,您可以使用共享库,或创建可配置(插件)模块结构。有关详细信息,您可能会发现 apache 1.3 网络服务器的源代码很有用。 http://httpd.apache.org/download.cgi

          【讨论】:

            【解决方案6】:

            cppdev 似乎是唯一一个用他/她的话来击中现场的人。 请查看the definition itself。简而言之:

            后期绑定或动态绑定是一种计算机编程机制 在其中按名称查找对象上调用的方法 在运行时。

            所有其他答案都忽略了要点,即“按名称查找”。

            所需的解决方案将非常类似于指向函数的指针查找表以及一个或两个函数以通过名称(甚至通过签名)选择正确的函数。我们称之为“哈希表”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-26
              • 1970-01-01
              • 2012-06-07
              相关资源
              最近更新 更多