注:本文由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,有助于减少代码的重复性和冗余性。
推荐资源
关于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代码时,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>。
下一步...
在下一篇文章中(真正的第一篇文章),我讲介绍一个简单的C++/CX类并讨论它是如何映射到Windows Runtime ABI。