适用于 .NET 和 UWP 的组件扩展
C++ 标准允许编译器供应商向语言提供非标准扩展。 Microsoft 提供了有助于将本机 C++ 代码连接到 .NET Framework 或通用 Windows 平台 (UWP) 上运行的代码的扩展。 .NET 扩展称为“C++/CLI”,并生成在 .NET 托管执行环境(称为“公共语言运行时 (CLR)”)中执行的代码。 UWP 扩展称为“C++/CX”,并生成本机代码。
注意
对于新应用程序,建议使用 C++/WinRT,而不是 C++/CX。 C++/ WinRT 是 Windows 运行时 API 的新标准 C++17 语言投影。 我们将继续支持 C++/CX 和 WRL,但强烈建议新应用程序使用 C++/WinRT。 有关详细信息,请参阅 C++/WinRT。
两个运行时,一组扩展
C++/CLI 扩展了 ISO/ANSI C++ 标准,并在 ECMA C++/CLI 标准下定义。 有关详细信息,请参阅使用 C++/CLI 进行 .NET 编程 (Visual C++)。
C++/CX 扩展是 C++/CLI 的子集。 虽然扩展语法在大多数情况下是完全相同的,但具体生成什么代码还是取决于你是将 /ZW
编译器选项指定给目标 UWP,还是将 /clr
选项指定给目标 .NET。 当使用 Visual Studio 创建项目时,将自动设置这些开关。
数据类型关键字
语言扩展包括聚合关键字,它是由用空格分隔的两个标记组成。 标记单独使用时可能表示一种含义,一起使用时可能表示另一种含义。 例如,单词“ref”是一个普通的标识符,单词“class”是一个声明本机类的关键字。 不过,如果将这两个字词组合成 ref class,生成的聚合关键字声明称为“运行时类”的实体。
扩展还包括上下文相关关键字。 某个关键字被视为区分上下文,即表示其语义取决于包含它的语句类型及其在该语句中的位置。 例如,标记“property”既可以是标识符,也可以声明特殊类型的公共类成员。
下表列出了 C++ 语言扩展中的关键字。
关键字 | 区分上下文 | 目的 | 参考 |
---|---|---|---|
ref class ref struct |
否 | 声明类。 | 类和结构 |
value class value struct |
否 | 声明值类。 | 类和结构 |
接口类 interface struct |
否 | 声明接口。 | 接口类 |
枚举类 enum struct |
否 | 声明枚举。 | 枚举类 |
property |
是 | 声明属性。 | property |
delegate | 是 | 声明委托。 | delegate(C++/CLI 和 C++/CX) |
event | 是 | 声明事件。 | event |
重写说明符
可以使用下列关键字来限定派生的替代行为。 虽然 new
关键字不是 C++ 的扩展,但仍列于此处,因为它可以在附加上下文中使用。 某些说明符还可用于本机编程。 有关详细信息,请参阅如何:在本机编译中声明替代说明符 (C++/CLI)。
关键字 | 区分上下文 | 目的 | 参考 |
---|---|---|---|
abstract | 是 | 指示函数或类是抽象的。 | abstract |
new |
否 | 指示函数不替代基类版本。 | 新(vtable 中的新槽) |
override | 是 | 指示方法必须替代基类版本。 | override |
sealed | 是 | 防止类用作基类。 | sealed |
泛型关键字
已添加下列关键字来支持泛型类型。 有关详细信息,请参阅泛型。
关键字 | 区分上下文 | 目的 |
---|---|---|
generic | 否 | 声明泛型类型。 |
where | 是 | 指定应用于泛型类型参数的约束。 |
杂项关键字
C++ 扩展中已添加下列关键字。
关键字 | 区分上下文 | 目的 | 参考 |
---|---|---|---|
finally | 是 | 指示默认异常处理行为。 | 异常处理 |
for each, in | 否 | 枚举集合元素。 | for each, in |
gcnew | 否 | 分配垃圾回收堆上的类型。 请不要使用 new 和 delete 。 |
ref new、gcnew |
ref new | 是 | 分配 Windows 运行时类型。 请不要使用 new 和 delete 。 |
ref new、gcnew |
initonly | 是 | 指示只能在声明时或在静态构造函数中初始化成员。 | initonly (C++/CLI) |
literal | 是 | 创建文本变量。 | literal |
nullptr |
否 | 指示图柄或指针不指向对象。 | nullptr |
模板构造
下列语言构造作为模板而非关键字实现。 如果指定 /ZW
编译器选项,它们将在 lang
命名空间中定义。 如果指定 /clr
编译器选项,它们将在 cli
命名空间中定义。
关键字 | 目的 | 参考 |
---|---|---|
array | 声明数组。 | 数组 |
interior_ptr | (仅限 CLR)指向引用类型中的数据。 | interior_ptr (C++/CLI) |
pin_ptr | (仅限 CLR)指向 CLR 引用类型以便暂时抑制垃圾回收系统。 | pin_ptr (C++/CLI) |
safe_cast | 确定并执行运行时类型的最佳转换方法。 | safe_cast |
typeid |
(仅限 CLR)检索用于描述给定类型或对象的 System.Type 对象。 | typeid |
声明符
下列类型声明符指示运行时自动管理已分配对象的生存期和删除。
运算符 | 目的 | 参考 |
---|---|---|
^ |
声明指向对象的句柄;即指向 Windows 运行时或不再可用时自动删除的 CLR 对象的指针。 | 对象句柄运算符 (^) |
% |
声明跟踪引用;即对 Windows 运行时或不再可用时自动删除的 CLR 对象的引用。 | 跟踪引用运算符 |
其他构造和相关主题
本节列出了其他编程构造以及与 CLR 相关的主题。
主题 | 说明 |
---|---|
__identifier (C++/CLI) | (Windows 运行时和 CLR)允许使用关键字作为标识符。 |
变量自变量列表 (...) (C++/CLI) | (Windows 运行时和 CLR)允许函数使用可变数量参数。 |
对应于 C++ 本机类型的 .NET Framework 类型 (C++/CLI) | 列出替代 C++ 整型类型的 CLR 类型。 |
appdomain __declspec 修饰符 |
__declspec 修饰符规定每个 appdomain 都存在静态和全局变量。 |
使用 /clr 时的 C 样式强制转换 (C++/CLI) | 描述如何解释 C 样式转换。 |
__clrcall 调用约定 | 指示符合 CLR 的调用约定。 |
__cplusplus_cli |
预定义宏 |
自定义属性 | 描述如何定义自己的 CLR 属性。 |
异常处理 | 概述异常处理。 |
显式重写 | 演示成员函数如何替代任意成员。 |
友元程序集 (C++) | 讨论客户端程序集如何访问程序集组件中的所有类型。 |
装箱 | 演示值类型进行装箱的条件。 |
编译器对类型特征的支持 | 讨论如何在编译时检测类型的特征。 |
managed、unmanaged 杂注 | 演示 managed 和 unmanaged 函数如何共存于同一模块中。 |
process __declspec 修饰符 |
__declspec 修饰符规定每个 process 都存在静态和全局变量。 |
反射 (C++/CLI) | 演示运行时类型信息的 CLR 版本。 |
字符串 | 讨论编译器如何将字符串文本转换为 String。 |
类型转发 (C++/CLI) | 允许将一个传送程序集中的类型移动到另一个程序集,从而使客户端代码无需重新编译。 |
用户定义的属性 | 演示用户定义的属性。 |
#using 指令 | 导入外部程序集。 |
XML 文档 | 使用 /doc(处理文档注释)(C/C++) 解释基于 XML 的代码文档 |