如何在 C 语言中实现后期绑定?
6 回答
后期绑定实际上并不是 C 语言本身的功能,更多的是您的执行环境为您提供的东西。
许多系统将提供延迟绑定作为链接器/加载器的一项功能,您还可以使用显式调用,例如dlopen
(打开共享库)和dlsym
(获取该库中符号的地址,以便您可以访问或调用它)。
与 C 标准进行后期绑定的唯一半便携式方法是使用一些技巧,system()
甚至至少部分是特定于实现的。
如果您不是在谈论延迟绑定而是在谈论多态,那么您可以使用函数指针来实现该效果。基本上,您创建一个struct
包含一个类型的所有数据以及用于定位该类型的方法的函数指针。然后,在“构造函数”(通常是init()函数)中,将函数指针设置为该类型的相关函数。
即使您不使用它,您仍然需要包含所有代码,但可以通过这种方式获得多态性。
C 中的符号绑定总是在编译时完成,而不是运行时。
库绑定或所谓的动态链接是通过*nixdlopen()
和Windows 上的and完成的。dlsym()
LoadLibrary()
GetProcAddress()
使用 Objective-C 或 Lua。两者都是后期绑定语言,可以轻松与 C 交互。
当然,您可以实现自己的名称解析方案,但为什么要重新发明轮子呢?
不幸的是,您没有指定操作系统。对于 Unix,您可以使用共享库,或创建可配置(插件)模块结构。有关详细信息,您可能会发现 apache 1.3 网络服务器的源代码很有用。http://httpd.apache.org/download.cgi
cppdev 似乎是唯一一个用他/她的话来击中当场的人。请看一下定义本身。简单来说:
后期绑定或动态绑定是一种计算机编程机制,其中在运行时按名称查找对象上调用的方法。
所有其他答案都错过了要点,即“按名称查找”。
所需的解决方案将非常类似于指向函数的指针查找表以及一个或两个函数以通过名称(甚至通过签名)选择正确的函数。我们称之为“哈希表”。