c – 为什么以及如何将旧代码的目标文件使用使用通用编程范例的新代码,即使模板是静态绑定?

这是一个完全不同的问题,而不是我之前提出的问题,这就是我发布这个问题的原因.

我想将我的主题定义为一个主观问题,激发解释“为什么”和“如何”的答案.根据Help Center规则允许这样做.

为了使我的问题更具建设性,我为您提供了更好地解释我的主题的资源.

C++ SuperFAQ下的问题

“你能给我一个简单的理由,为什么虚函数(动态绑定,动态多态)和模板(静态多态)会产生很大的不同?”

作者说,“……程序员可能会编写一些由他们伟大的曾祖父写的框架调用的代码.没有必要改变伟大的爷爷的代码.事实上,对于动态绑定虚拟函数,它甚至不需要重新编译.即使你剩下的只是对象文件和25年前伟大的爷爷写的源代码丢失了,那个古老的目标文件将没有任何东西调用新的扩展名分崩离析.“

他继续说,“这是可扩展性,这是强大的可重用抽象的OO和通用编程.”

此外,我最近阅读了由B Bjarne Stroustrup的创作者撰写的一篇名为“Why C++ is not just an Object-Oriented Programming Language”的论文.在他的论文中,他将语言或技术定义为面向对象的,当且仅当它直接支持:

  1. Abstraction – providing some form of classes and objects.

  2. Inheritance – providing the ability to build new abstractions out of existing ones.

  3. Run-time polymorphism – providing some form of run-time binding.

他还简要提到了通用编程.

6.7 Generic Programming – A major theme in the C
++ community over the last few years has been the development of techniques exploiting the template mechanism.

通过阅读这两个资源,我可以理解旧代码如何通过面向对象的范例来使用新代码.但是,我不明白旧代码如何通过使用泛型编程(在本例中为模板)来使用新代码,因为泛型编程使用静态绑定.根据我之前的相关问题,Ben Voigt评论说,

“对于要与”新“模板代码结合的”旧“模板代码,必须将两者编译在一起.”

C SuperFAQ似乎暗示(对于OO和泛型编程)旧代码不必使用新代码重新编译以使用新代码,并且您应该只需要旧代码中的目标文件.从而,保持代码可重用性.

有人可以回答“为什么”和“如何”旧代码的目标文件可以使用使用通用编程范例的新代码,即使模板是静态绑定?

编辑

我想更详细地解释下面的答案,因为它将帮助我理解更多,并可能帮助其他人理解.由于泛型编程使用静态绑定,因此旧代码的源代码和新代码的源代码必须“一起”重新编译,以使代码可重用性生效.这意味着,如果您只拥有旧代码的目标文件,则无法使用新代码,因为这需要在运行时绑定的动态/后期绑定.

最佳答案 简短的回答是它不能.我猜这就是你联系的答案第一句话的意思:

They can improve reuse by letting old code call new code provided at run time (virtual functions) or compile time (templates).

[强调补充]

对于使用模板的现有代码,您必须重新编译.这意味着你必须从(某种形式的)源代码开始,而不是从目标文件开始(至少不是大多数人认为的普通目标文件).

点赞