什么是C ++ / CX和C ++ / CLI,它们与C ++和WinRT有何关系?


31

我当时正在考虑接受学习C ++来设计Metro应用程序的挑战,那是我遇到C ++ / CX的时候。

Metro应用程序可以用C ++ 11编码吗?他们需要C ++ / CX才能工作吗?C ++ / CX到底是什么?是否可以仅使用C ++创建Metro应用,还是需要C ++ / CX?另外,C ++ / CLI如何与这张图片联系起来?


另外,现在不建议使用C ++ / CX(首选C ++ / WinRT),请参阅文档
SWdV

Answers:


28

微软过去只是简单地制作一个C ++系统,使您可以访问其Windows API(称为win32),然后有一天,他们发明了.NET并认为一切都必须改变。

因此,他们创建了“ C ++托管扩展”,它基本上是C ++,但带有大量非标准扩展,并添加了诸如__gc支持.NET功能的关键字(例如在GC堆上进行分配,而不是在本地进行分配)。

但是人们并不喜欢它,因为C ++具有所有这些额外的关键字,因此Microsoft重新设计了它并将其称为C ++ / CLI,它具有更少的附加关键字集,但引入了语法更改,例如^( GC堆上.NET对象的引用“指针”)。

几年后,微软意识到.NET并不是他们所说的灵丹妙药,并且他们还合并了他们的战斗Windows和Developer团队。重新评估的一部分导致创建了一个全新的Windows API,称为WinRT,该API完全是本机代码,这意味着旧的扩展不再有用,因此Microsoft将其C ++扩展开发为可以与新的扩展一起使用的扩展。 WinRT API更容易-通过保留C ++ / CLI的一些扩展名(例如^)。

因此,您可以找到扩展C ++的3个不同版本,这些版本表面上是C ++。至少最新的版本还是本机代码,因此如果您不想使用扩展名,则可以直接访问API(它称为WRL,与旧的ATL模板类非常相似),因此不需要

如果您认为您可能不想编写跨平台代码,则可以-可以更改API调用,但不能^在Visual C ++以外的任何编译器上使用。我建议使用WRL API,并尽可能将您的代码保持为标准,因为与C ++ / CX相比,您需要编写的“额外代码”不太好。


注意:C ++ / CX直到最后才提到。最好明确指出其段落中的哪一个。
橡子

11

引用http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx

。。。尽管C ++ / CX在语法上类似于C ++ / CLI,因此在许多方面看起来几乎相同,但在语义上却大不相同。C ++ / CX代码是本机代码,不需要CLR。使用C ++ / CLI进行编程可能会非常具有挑战性,因为必须同时巧妙地处理两个截然不同的对象模型:具有确定性对象生存期的C ++对象模型和垃圾收集的CLI对象模型。C ++ / CX的使用更加简单,因为基于COM的Windows运行时可以很好地映射到C ++编程语言。

Windows运行时定义了一个相对简单的低级应用程序二进制接口(ABI),并要求组件使用通用的元数据格式定义其类型。编写本机Windows运行时组件并非严格要求C ++ / CX:在不使用C ++ / CX语言扩展的情况下使用C ++编写Windows Runtime组件是完全可能的,并且Visual C ++ 2012包括一个库,即Windows Runtime C ++模板库( WRL),以帮助简化此操作。Windows附带的许多Windows运行时组件(在Windows名称空间中)都是使用WRL编写的。C ++ / CX中没有魔术:它使用C ++编写Windows Runtime组件变得非常简单得多,并且有助于减少使用诸如WRL之类的基于库的解决方案时必须编写的重复和冗长的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.