您的位置:首页 > 移动开发

Windows Store apps开发[19]C++/CX Part 0 of [n]: C++/CX简介

2012-09-01 14:08 351 查看



注:本文由BeyondVincent(破船)原创首发

转载请注明出处:BeyondVincent(破船)@DevDiv.com

大家好,我是James McNellis,最近我加入了Visual C++团队,作为一个库开发人员。我第一次遇到C++/CX语言扩展是在去年年初(2011年)的时候,为Visual Studio 2012 XAML设计器实现了一些代码生成功能。刚开始我在寻找一些示例代码,当我第一次看到C++/CX时,我感到很惊讶。我最初的反应是这样的:

“在这些C++代码中到底做了什么?”

实际上,我非常的担心;因为我认为它是C++/CLI托管代码。本身来讲,托管代码是好的,但是作为一名C++程序员,我喜欢本地代码(native code)。

谢天谢地,我的初步理解是不正确的:C++/CX语法上与C++/CLI非常类似,因此,在许多地方看起来非常相同,但是从语义上讲,它们是完全不同的。C++/CX代码是本地代码,不需要公共语言运行时(CLR)。

用C++/CLI编程是很有挑战的,有一点就是需要同时巧妙的处理两个不同的对象模型:生命周期确定的C++对象模型,垃圾回收CLI对象模型。C++/CX则相对简单,因为Windows Runtime是基于COM风格的,与C++编程语言有很好的映射。

Windows Runtime的定义相对简单,底层应用程序二进制接口(ABI)和以及组件类型的定义是使用通用的元数据(metadata)格式。在写本地的Windows Runtime组件时,并不一定要求使用C++/CX,也可以只用C++来完成Windows Runtime组件的编写,Visual C++ 2012包含一个库,即Windows
Runtime C++ 模板类库(WRL),在这个类库的帮助下,组件的编写会更加的容易。许多Windows Runtime组件,例如Windows中的部分(在Windows名称空间里面),就是用WRL编写的。C++/CX没有什么神奇的:只是使用C++来写Windows Runtime组件更容易,在编写组件时,使用基于模板的解决方案,例如WRL,有助于减少代码的重复性和冗余性。

本系列文章主要讨论Windows Runtime ABI和介绍在使用C++/CX语言构造时,底层到底发生了什么,演示使用用C++编写Windows Runtime组件时,使用和不适用C++/CX时,的对等性,以及介绍C++编译器是如何将C++/CX代码编译为汇编的。

推荐资源

关于C++/CX,已经有一些非常好的资源了,我不会在这里重复写相关的一系列文章来取代它们,因此在开始深入C++/CX之前,我在这里总结一下这些资源。

首先,如果你对如下内容感兴趣:为什么使用C++/CX语言扩展来进行开发,以及C++/CLI语法是如何最终被选定和重用的,我建议你阅读Jim Springfield去年在博客上发表的这篇文章,"Inside
the C++/CX Design". 同样需要关注这篇文章
episode 3 of GoingNative,这是Marian Luparu讨论C++/CX的。

如果针对C++/CX你是刚刚开始(或者用于Windows Store程序和Windows Runtime组件开发),或者你正在寻找使用C++/CX编写软件的介绍,又或是你需要使用C++/CX来构建一些东西,以试图完成一项特殊的任务,我建议你从下面的资源开始学习:

Visual C++ Language Reference (C++/CX):语言参考包含了大量有用的信息,有C++/CX语法参考,并附带许多短小的示例演示。这里还有一个有用的演示程序:如何使用C++/CX和XAML来创建一个Windows Store程序。如果你刚刚开始,这将是一个非常好的起点。

C++ Metro 风格程序示例:这里的许多C++示例程序和组件使用了C++/CX,并演示了与XAML的交互。

Runtime 平台的组件扩展:这个文档曾用于C++/CLI,但是它已经被更新了,增加了C++/CX相关文档介绍,并对比了不同语言扩展的每一个语法特征。

Hilo是一个示例程序,使用C++,C++/CX和XAML编写的,是学习良好代码实践的非常棒的资源——包含了modern C++和在普通C++中混合了C++/CX。

Building Metro style apps with C++是MSDN论坛上非常好的一个地方,当你被问题卡住时,你可以到这里进行提问。

工具探索



通常,学习编译器如何处理代码的最佳方法就是查看编译器的输出内容。就C++/CX而言,这里有两个输出内容值得研究:组件的元数据(Metadata),以及将C++/CX代码转换为C++的代码。

(Metadata):如上所述,Windows Runtime需要的每一个组件,都包含元数据,元数据里面是关于组件的公共类型的定义和这些类型的公有和保护成员。这些元数据存储在一个以.winmd为扩展名的Windows Metadata(WinMD)文件中。当你使用C++/CX构建一个Windows Runtime组件时,WinMD文件由C++编译器生成;当使用C++(没有C++/CX)构建一个组件时,WinMDx文件从IDL生成。WinMD文件使用的元数据格式与.NET程序集相同。

如果你想知道为了支持C++/CX代码,C++编译器都产生了什么些类型,或者再元数据中,C++/CX语言的构造有什么不同的地方,那么深入考察生成的WinMD文件是非常有用的。由于WinMD文件使用.NET元数据格式,那么可以通过使用.NET framework SDK中的ildasm工具,来查看WinMD文件中内容。

生成的代码:当编译C++/CX代码时,Visual C++编译器将C++/CX转换为与之等价的C++代码。如果你对C++/CX代码转换为什么样的代码的比较好奇,那么查看一下转型是非常有用的。

这里有一个绝密(top-secret)的编译器选项,/d1ZWtokens,这个选项可以引起编译器将C++/CX源码生成为C++代码。(当然,这个编译器选项并不是真正的绝密: Deon Brewis在他的excellent //BUILD/ 2011 presentation提到过,"Under
the covers with C++ for Metro style apps.".请注意,这个选项是没有公开的,它的行为在任何时候都可能会改变。)

这个编译选项(/d1ZWtokens)的输出仅仅是为了某些诊断,所以你不能将输出内容进行拷贝和粘贴,并期望它是编译为as-is的,但是对于演示编译器如何在编译期间处理C++/CX代码已经足够好了。以至于该选项非常重要.输出内容非常详细,包括任何生产的头文件,以及潜在的包含<vccorlib.h>。

这里还有另外两个非常有用的编译选项,同样在Deon的介绍中有提到,这两个选项将有助于你理解类的继承和虚函数表(vtables)是如何布局的。第一个是/d1ReportAllClassLayout,这个编译选项会使编译器打印出所有类的类和虚函数表的布局,以及转换单元的功能。另外一个选项是/d1ReportSingleClassLayoutClyde,这个会使编译器打印出任意类名包含"Clyde"(使用自己的类型名称替换Clyde)的类的类和虚函数表布局。这些选项同样是没有公开的,也不被支持,并且它们只能用于诊断。

下一步...



下一篇文章中(真正的第一篇文章),我讲介绍一个简单的C++/CX类并讨论它是如何映射到Windows Runtime ABI。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: