【问题标题】:What are static and dynamic binding in C (strictly C,not C++)?C(严格来说是 C,不是 C++)中的静态和动态绑定是什么?
【发布时间】:2013-05-07 13:42:40
【问题描述】:

我最初担心发布这个问题,以免它重复。但即使在谷歌上搜索了许多关键字后,我在 StackOverflow 上也找不到任何解释 C 的静态和动态绑定的链接。有 C++ 的问题和答案虽然,但都涉及classes 和显然不适合 C 的东西。而且 StackExchange 之外的链接非常可疑。

我需要知道这两个绑定之间的严格定义和对比,仅在 C 的上下文中。如果你能花一些时间来回答它,我将不胜感激,或者给我 StackOverflow 上的链接,以免我弄错了之前已经详细回答过。

我打算对以下方面有一个清晰的想法:

  1. C 中的绑定。
  2. C 中的静态与动态绑定。

编辑如果您能用一些简单的代码 sn-ps 来解释差异,那将非常有帮助。

【问题讨论】:

  • 这个链接解释了绑定,虽然不是专门在 C:en.wikipedia.org/wiki/Name_binding
  • @taocp 我查过了。事实上,维基百科是我查过的第一个链接。

标签: c dynamic-binding static-binding


【解决方案1】:

形式上,“原生”C 中没有这样的术语。

术语静态绑定(“早期绑定”)和动态绑定(“后期绑定”)的简化解释:它们最常用于面向对象的设计中,以确定调用特定继承成员函数的决定是否是在编译时或运行时完成。

虚函数的含义是它是一个被调用的继承函数,而不是被继承的基类中的等效函数。如果编译器可以在编译时确定对象是“基类”类型还是“继承类”类型,则获得静态绑定,否则为动态绑定。因此,您需要某种运行时类型信息 (RTTI)。

在上述上下文中,这些术语仅在您在 C 程序中使用面向对象的继承/多态性时才有意义。 C 语言不支持这种机制。 可以在 C 中“手动”实现它们,但是这很乏味,而且代码往往很混乱。对于那些坚持的人,有一本书“ANSI-C 中的面向对象设计”演示了如何做到这一点。

(我个人推荐那本书,也不用 C 实现多态性。如果你需要那些 OOP 功能,只需用 C++ 编写代码。)

【讨论】:

  • 所以在我转向 OOPS 之前,这个拇指规则对我来说是否足够 - In C,there is only static binding.The compiler takes care of all binding at compile time.No dynamic binding at all.End of story!!.Right?
  • @Rüppell'sVulture:实际上,您可以通过函数指针在 C 中伪造动态绑定(这是关于“手动”实现它的一点点),但通常不会“感觉”就像 C++ 中的动态绑定,如果这有意义的话。
  • @Rüppell'sVulture 可以使用函数指针数组等模拟虚拟成员函数表。您可以在 C 中实现所有需要的 OOP 功能,只是没有花哨的语言支持。跨度>
【解决方案2】:

C 是一种静态编译语言,它并没有真正的“动态绑定”。

您可以使用诸如 POSIX'dlopen() 之类的 API 手动执行此操作,但我会犹豫称其为“绑定”,尽管在某种意义上我猜它是。

【讨论】:

  • 考虑dynamic 内存分配使用malloc() 的情况。我可能没有使用正确的术语dynamic。不过,您如何描述C 中的malloc() 之类的情况?跨度>
  • @Rüppell'sVulture 似乎存在某种术语不匹配;绑定通常用于指代在编程语言中将名称(变量名称、函数名称、类型名称等)与其“含义”“连接”的过程。这与内存分配无关......
  • 但是如果是这样,那么关键和重要的“连接”不是应该在所有编程语言的编译时完成吗?怎么可能,以及使用什么程序可以允许这样的“连接”在运行时以任何语言完成?这样做会带来什么好处?需要什么?
  • 在编程中,动态通常意味着“在运行时”。我们有动态绑定、动态内存、动态链接库等等。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 2014-09-27
  • 2023-03-16
  • 2016-04-18
  • 2013-10-07
  • 1970-01-01
  • 2011-05-06
  • 2011-03-23
相关资源
最近更新 更多