C++ [CX]第0部分[N]简介

你好;我是James McNellis,我最近加入VisualC++团队作为一个库开发人员。我去年首次遇到C++/CX语言扩展,同时为VisualStudio 2012 XAML设计器实现了一些代码生成功能。我从寻找一些示例代码开始 可以说,我对我第一次看到的东西有点惊讶。我最初的反应是:

null

“这些帽子在C++代码中做了什么?”

其实,我很担心;因为我认为它是C++ + CLI托管代码。不是那个托管代码是坏的,但是我是C++程序员,我已经答应了本地代码。

谢天谢地,我最初的印象是不知情和错误的:而C++ +CX是 句法上 类似于C++ +CLI 在很多方面几乎是一样的 语义上 完全不同。C++代码是本地代码,不需要CLR。在C++中,编程必须是非常具有挑战性的,因为必须同时巧妙地处理两个非常不同的对象模型:C++对象模型及其确定的对象生命周期,以及垃圾收集的CLI对象模型。C++和CX的工作要简单得多,因为基于COM的Windows运行时很好地映射到C++编程语言。

Windows运行时定义了一个相对简单的低级应用程序二进制接口(ABI),并要求组件使用公共元数据格式定义其类型。C++ + CX不严格 必修的 编写一个本机Windows运行时组件:使用C++可以不用使用C++或CX语言扩展来编写Windows运行时组件,Visual C++ 2012包括一个库, Windows运行时C++模板库(WRL) ,以帮助简化此过程。作为Windows的一部分提供的许多Windows运行时组件(在 Windows 命名空间)使用WRL编写。C++中没有魔法:它只是在C++中编写Windows运行时组件,简单得多,而且有助于减少使用WRL时基于库的解决方案所需编写的重复和冗长代码的数量。

本系列文章的目的是讨论Windows运行时ABI,并解释当使用C++/CX语言构造时,引擎盖下发生了什么,通过演示用C++编写的等效Windows运行时组件既有C++又有C++。并通过C++编译器实际如何编译C++和CX代码来编译。

已经有相当多的关于C++的信息来源,我当然不想用简单的博客文章来代替它们,所以在我们开始深入研究C++或CX之前,我想从这些资源的汇总开始。

首先,如果你对背后的原理感兴趣 为什么? C++/CX语言扩展被开发出来,C++ C++语法如何最终被选择重用,我将从去年的博客中推荐Jim Springfield的文章。 “C++内部/ CX设计” . 同样值得注意的是 《去本地》第三集 ,其中Marian Luparu讨论C++和CX。

如果您对C++或CX(或者Windows存储应用程序和Windows运行时组件开发的一般)是新的,并且正在寻找用C++或CX构建软件的介绍,或者如果您正在使用C++或CX构建一些东西,并且正在试图解决如何完成特定任务,那么我建议以下资源作为起点:

  • Visual C++语言参考(C++/CX): 语言引用包括许多有用的信息,包括C++和CX语法参考,许多简短的例子说明了它的用法。还有一个有用的演练,如何使用C++和CX+XAML构建Windows存储应用程序。如果你刚刚开始,这将是一个很好的开始。

  • C++ Metro风格的应用程序示例: 大多数C++示例应用程序和组件都使用C++和CX,很多演示了与XAML的互操作。

  • 运行时平台的组件扩展 这是C++/CLI的文档,但是它已经被更新,包括C++ C++的文档,每个语法扩展中每个句法特征的比较。

  • 希洛 是C++、C++ C++、XML编写的一个示例应用程序,是一个很好的资源,可以从中观察到现代C++的良好编码实践,并将普通C++代码与C++/CX混合。

  • 用C++构建地铁风格应用程序 在MSDN论坛是一个很好的地方问问题,如果你卡住了。

勘探工具

通常,了解编译器如何处理代码的最佳方法是查看编译器的输出。对于C++/CX,有两个有用的输出:组件的元数据,以及C++ C++代码的C++转换。

元数据: 如上所述,Windows运行时要求每个组件包含元数据,其中包含由该组件定义的任何公共类型以及这些类型的任何公共成员或受保护成员的信息。此元数据存储在扩展名为.WinMD的Windows元数据(WinMD)文件中。当使用C++或CX构建Windows运行时组件时,WINMD文件由C++编译器生成;当使用C++ C++构建组件时(不带c++/cx),则从IDL生成WiMD文件。WinMD文件使用与.NET程序集相同的元数据格式。

如果您想知道C++编译器为支持C++或CX代码而制作了哪些类型,或者如何在元数据中出现不同的C++/CX语言构造,那么通过检查生成的WIMD文件开始就很有用。因为WinMD文件使用.NET元数据格式,所以可以使用 反编译工具 工具来查看WinMD文件的内容。这个工具不会对数据做太多解释,因此需要一些时间来习惯它如何呈现数据,但它还是非常有用的。

生成的代码: 在编译C++/CX代码时,Visual C++编译器将大多数C++/CX构造转换成等效的C++代码。如果你对C++ +CX代码的特定片段感到好奇,那么看看这个转换是有用的。

有一个绝密的编译器选项, /d1ZWtokens酒店 这会导致编译器打印生成的C++代码,而C++代码是从c++/cx源生成的。好吧,这个编译器选项并不是真正的绝密:Deon Brewis在他出色的//BUILD/2011演示中提到了它, “在C++的封面下,适用于地铁风格的应用程序。” 但是,请注意,此选项没有文档记录,因此不受支持,其行为可能随时更改。)

输出仅用于诊断目的,因此您不能仅复制和粘贴输出,并期望它是可编译的,但它足以说明编译器如何在编译期间处理C++ /CX代码,这使得这个选项非常宝贵。输出非常冗长,因此最好将此选项与尽可能小的源文件一起使用。输出包括任何生成的头,包括隐式包含的头 <vccorlib.h> . 我发现最好使用具有不同名称的类型和成员,这样您就可以轻松地搜索与代码对应的部分。

Deon的演示中还提到了另外两个有用的编译器选项,如果您想弄清楚类层次结构和虚拟函数表(vtables)是如何布局的,那么这两个选项可能会很有用。首先是 /d1reportAllClassLayout报告 ,这将导致编译器打印出翻译单元中所有类和函数的类和vtable布局。另一个是 /d1reportSingleClassLayoutClyde报告 这将导致编译器打印出名称包含“Clyde”的任何类的类和vtable布局(用“Clyde”代替您自己的类型名)。这些选项也没有文档记录并且不受支持,它们也只能用于诊断目的。

下一个…

在我们的下一篇文章(这将是第一个“真实”的文章)中,我们将介绍一个简单的C++/CX类,并讨论它如何映射到Windows运行时ABI。 以下是本系列迄今为止已发表的所有文章的列表:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享