gpt4 book ai didi

c++ - C++ 中的 RTTI 和可移植性

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:11 33 4
gpt4 key购买 nike

如果编译器不“支持”RTTI,是否意味着编译器无法处理其中包含虚函数的类层次结构?还是我误解了有关 RTTI 不可移植的文献,而问题出在其他地方?

谢谢大家的评论!

最佳答案

这可能更像是您正在寻找的答案,但这里是:

RTTI is not "portable"意味着如果你使用编译器A构建动态库A,并使用编译器B构建与A链接的应用程序B,那么你不能使用RTTI,因为编译器a和b的RTTI实现是不同的。虚函数受到影响只是因为虚函数机制也可能不是二进制兼容的。

这个问题在 90 年代中期非常重要,但现在已经过时了。并不是因为编译器现在都变得相互二进制兼容,而是恰恰相反:C++ 开发人员现在已经认识到 C++ 库必须作为源代码而不是可链接库交付。对于那些将 C++ 视为 C 的扩展的人来说,这非常令人不安,但对于在开源环境中成长的更多现代程序员来说,这并没有什么特别的。

从 20 世纪 90 年代中期到现在,人们对什么是有值(value)的知识产权和什么不是有值(value)的知识产权持有不同的态度。也就是说:实际上有一项关于“表达模板”的专利已在美国专利局注册。即使是这样的持有人也意识到该专利是不可执行的。

C 风格的“头文件和二进制”库长期以来被视为混淆有值(value) 源代码的一种方式。越来越多的企业开始认识到这种混淆与其说是保护性的,不如说是弄巧成拙:很少有代码符合“有值(value)的 IP”状态。大多数人购买图书馆不是因为它包含特殊的 IP,而是因为购买比自己滚动更便宜。事实上:知识产权应用的专业知识远比知识产权本身更有值(value)。但是如果没有人关心这个 IP 因为他们不知道它,那么它就不值钱了。

这就是开源的运作方式:IP 是自由分发的,作为返回,这些分发者在应用该 IP 时获得咨询费。那些可以自己解决问题的人有利可图——对他们很好。但这不是常态。实际发生的情况是,开发人员了解 IP 并在购买实现它的产品时出卖他们的雇主。是的,整个“开发者社区”都是建立在这个前提下的。

长话短说:一旦开源运动开始,二进制(以及随后的 RTTI)兼容性就消失了,同时,C++ 模板库成为常态。 C++ 库很久以前就变成了“仅可分发的源代码”,如 Perl、Python、JavaScript 等。要使您的 C++ 编译器与您使用它编译的所有源代码一起工作,请确保 RTTI 已打开(包括所有 C++ 标准功能,如异常) ,并且您链接的所有 C++ 库都同样符合您用于编译应用程序的相同选项。

据我所知,有一个(也是唯一一个)编译器在默认情况下不启用 RTTI,这是因为还有其他遗留方法可以做同样的事情。要了解这些内容,请阅读 Don Box 的优秀著作“Essential COM”。

关于c++ - C++ 中的 RTTI 和可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2709669/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com