C++/CX

维基百科,自由的百科全书
跳转至: 导航搜索

C++/CX (Visual C++ Component Extensions,Visual C++ 组件扩展) 是微软的C++编译器对C++的扩展,使得程序员可以比较方便地编写面向Windows Runtime(WinRT)的程序。这个语言规范引入了一系列语法和类库抽象,以对C++程序员来说比较自然的方式暴露了基于组件对象模型(COM)的WinRT编程范型的接口。

这个语言扩展从C++/CLI借用了语法,但是是面向WinRT和原生码而不是通用语言运行库托管代码

扩展语法[编辑]

C++/CX为WinRT编程引入了新的语法。和平台独立的语法和C++11标准兼容。

对象[编辑]

WinRT对象的创建方式是通过ref new关键字,并赋值给具有^(帽子)注记的类型的变量,这个帽子标记是继承自C++/CLI。

Foo^ foo = ref new Foo();

一个WinRT变量仅仅是一对指针,一个指向虚函数表,另一个指向对象的内部数据

引用计数[编辑]

一个WinRT对象是使用引用计数模式来维护其生命期的,处理方式类似于被智能指针封装的常规C++对象。对象在没有引用时销毁。尽管没有垃圾回收机制,但是语言规范也保留了gcnew关键字以备以后使用。


局部类型[编辑]

C++/CX引入了局部类型的概念。这个特性使得一个类的定义可以被分离到多个文件,使得XAML图形用户界面设计工具能够自动生成部分代码到一个单独的文件,以避免干扰程序员写的代码。这些局部类型在编译时合并。这个特性在类似C#之类的CLI语言中已经存在很多年。局部类型并未成为C++标准,所以并不能在纯C++11代码中使用。


这里是一个设计工具生成的局部类型示例:

// foo.private.h
 
#pragma once
 
 
 
partial ref class foo
 
{
 
private:
 
   int id_;
 
   Platform::String^ name_;
 
};

这里是一个程序员编写的类示例。生成的局部类型在开头被导入,注意这里partial关键字不是必要的:

// foo.public.h
 
#pragma once
 
#include "foo.private.h"
 
 
 
ref class foo
 
{
 
public:
 
   int GetId();
 
   Platform::String^ GetName();
 
};


这是局部类型的实现部分代码的示例:

// foo.cpp
 
#include "pch.h"
 
#include "foo.public.h"
 
 
 
int foo::GetId() {return id_;}
 
Platform::String^ foo::GetName {return name_;}

泛型[编辑]

WinRT支持泛型,所以C++/CX也支持。泛型类的信息被保留在元数据内,在运行时才实例化,而不是像C++模板那样在编译时示例化。编译器支持在一个类型中同时使用泛型和模板。


泛型类示例:

generic<typename T> 
 
public ref class bag 
 
{
 
     property T Item;
 
};

元数据[编辑]


所有WinRT程序都通过元数据来描述其中的类型。元数据的格式和通用语言架构(CLI)为.NET Framework规定的标准一致。这个特性使得C++/CX、CLI语言和Javascript的代码可以互相引用。


运行库[编辑]

C++/CX有一系列针对WinRT的代码库,帮助C++程序员将使用C++標準程式庫的代码移植到WinRT.