**C++/CLI**（CLI: **C**ommon **L**anguage **I**nfrastructure）在计算机语言中是一门由微软设计，用来代替C++托管扩展（Managed C++，下文使用MC++指代）的语言。这门语言在兼容原有的C++标准的同时，重新简化了托管代码扩展的语法，提供了更好的代码可读性。和微软.NET的其他语言一样，微软向ECMA提交了C++/CLI的标准化请求，并且被ECMA通过成为正式的标准。C++/CLI现在可以被Visual C++ 2005和更高版本的编译器支持。C++/CLI的部分特性已经申请了专利。

语法改变
----

C++/CLI是一门独立的语言（比如新的关键字），而不是像C++托管扩展一样是C++的超集。（C++托管扩展有一些不标准的关键字如\_\_gc和\_\_value）。所以，C++/CLI对于这些语法有较大的改变，尤其是去除了一些意义不明确的关键字，增加了一些对.NET的特性的语言级别的支持。

### 关键字

有歧义的语法，像MC++的不同版本用新的操作符gcnew区分：在C++/CLI，.NET引用类型的创建需要要使用新的关键字gcnew，以和本地类型区分开。
C++/CLI增加了新的泛型概念（书写方式与C++的模板相似，但行为有很大的測試区别）。

数据类型
----

### 基本数据类型

| C++/CLI基本类型 | System命名空间中对应的类 | C#类型 | 注释/用法 |
| --- | --- | --- | --- |
| bool | System::Boolean | bool | bool dirty = false; |
| char或signed char | System::SByte | sbyte | char sp = ' '; |
| unsigned char | System::Byte | byte | unsigned char ch = '\0'; |
| wchar\_t | System::Char | char | wchar\_t wch = ch; |
| short | System::Int16 | short | short s = ch; |
| unsigned short | System::UInt16 | ushort | unsigned short s = 0xffff; |
| int或long | System::Int32 | int | int ival = s; |
| unsigned int或unsigned long | System::UInt32 | uint | unsigned int ui = 0xffffffff; |
| long long | System::Int64 | long | long long etime = ui; |
| unsigned long long | System::UInt64 | ulong | unsigned long long mtime = etime; |
| float | System::Single | float | float f = 3.14f; |
| double或long double | System::Double | double | double d = 3.14159; |

### 句柄（Handle）代替了指针

回到MC++，有两类指针：用\_\_nogc标识的指针是传统意义上的C++指针，而用\_\_gc标识的指针为.NET中的引用。但在C++/CLI里，唯一的指针就是传统意义上的C++指针，而.NET引用类型使用一个"句柄"来获取，使用新的语法"类名^"代替了MC++的"类名\*"。新的句法使得托管和非托管代码混合开发更加方便；它指明了对象将会被垃圾回收器自动销毁还是手动销毁。

范例代码：

```
 // C++托管扩展
 #using <mscorlib.dll>
 using namespace System::Collections;
 \_\_gc class referencetype
 {
 protected:
 String\* stringVar;
 int intArr \_\_gc[];
 ArrayList\* doubleList;
 public:
 referencetype(String\* str，int\* pointer，int number) // 哪个是托管的?
 {
 doubleList = new ArrayList();
 System::Console::WriteLine(str->Trim() + number.ToString());
 }
 };

```

```
 // C++/CLI
 #using <mscorlib.dll>
 using namespace System::Collections::Generic;
 ref class referencetype
 {
 protected:
 String^ stringVar;
 array<int> intArr;
 List<double>^ doubleList;
 public:
 referencetype(String^ str，int\* pointer，int number) // 不会再分不清了吧?
 {
 doubleList = gcnew List<double>();
 System::Console::WriteLine(str->Trim() + number);
 }
 };

```

### 托管类型的定义

在CLR中，托管类型是分为引用类型（class）和值类型（struct）的，在C++/CLI中的分别定义方式如下：

引用类型：

```
   public ref class MyClass
   {
   };
```

值类型：

```
   public value class MyClass
   {
   }; 
```

### 数组

数组现在需要用cli名字空间内的array类声明，语法和STL的vector类似。

C++/CLI中新增了array<T> ^的方式定义数组。

```
   array<int> ^a = gcnew array<int>(100) { 1, 2, 3 };
```

或者使用它的完整版：

```
   cli::array<int> ^a = gcnew cli::array<int> {1, 2, 3}; 
```

### System::String

```
 #include <string>
 using namespace std;
 using namespace System;
 using namespace System::Runtime::InteropServices;

 string cast\_to\_string(String^ str)
 {
 IntPtr ip = Marshal::StringToHGlobalAnsi(str);
 const char\* ch = static\_cast<const char\*>(ip.ToPointer());
 string stdStr = ch;
 Marshal::FreeHGlobal(ip);

 return stdStr;
 }

```

### 不定参数

对于C#中的不定参数的语法：

```
   void foo(params string[] args)
```

在C++/CLI中对应的版本为：

```
   void foo(... array<String^>^ args) 
```

### 跟踪引用（Tracking reference）

C++/CLI里的一个"跟踪引用"也是一个控制代碼，但它是传地址而不是传值。等同于在C#中加了"ref"关键字，或Visual Basic .NET的"ByRef"。C++/CLI使用"^%"语法来定义一个跟踪引用。与传统C++中的"\*&"语法相似。

下面的示例了"跟踪引用"的使用。如果把"^%"改成"^"（也就是使用普通的句柄），10个字符串将不会被修改，而只会生成那些字符串的副本，这些都是因为那些引用已经不是传地址而是传值。

```
 int main()
 {
 array<String^>^ arr = gcnew array<String^>(10);
 int i = 0;
 
 for each(String^% s in arr)
 s = gcnew String(i++.ToString());
 
 return 0;
 }

```

上面的代码示例了用户如何用C++/CLI做一些其他.NET语言不能做的事情，比如C#就不允许在foreach循环中这样做。例如`foreach(ref string s in arr)`在C#中是非法的。

### 析构(Finalizer/Destructor)

C++/CLI的另一个变化就是使用"!类名（）"来声明一个托管类型的"析构方法"（在垃圾回收器回收对象之前的不确定的时间由CLR调用），而原来的"~类名（）"是用来定义"传统的析构函数"（能被用户自己调用）。另外，下面的例子说明了如何在C++/CLI中托管对象如何自动调用"传统析构函数"。

在一个典型的.NET程序中（例如直接使用CLI）编程，可以由用户自己调用的"解构方法"是用实现IDisposable接口，通过编写Dispose方法来实现显式释放资源；而不确定的"解构方法"是通过重载Finalize函数来实现的。

```
 // C++/CLI
 ref class MyClass // :IDisposable (编译器自动实现IDisposable接口)
 {
 public:
 MyClass(); // 建构函数
 ~MyClass(); // (确定的) 析构函数 (编译器使用IDisposable.Dispose来实现)
 protected:
 !MyClass(); // 解构方法 (不确定的) (编译器通过重载virtual void Finalize来实现) 
 public:
 static void Test()
 {
 MyClass \_auto; // 这不是个控制代碼，它将调用MyClass的默认建構函数
 // 使用\_auto对象 
 // 函数返回前自动调用\_auto的析构函数(IDisposable.Dispose，由~MyClass()定义)来释放资源 
 // 以上代码等效于: 
 MyClass^ user = gcnew MyClass(); 
 try { /\* 使用\_auto对象 \*/ } 
 finally { delete user; /\* 由编译器调用\_auto.Dispose() \*/ } 
 }
 };

```

```
 // C#
 class MyClass : IDisposable
 {
 public MyClass() {} // 构造函数
 ~MyClass() {} // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现)，与C++/CLI的!MyClass()等效
 public void Dispose() {} // Dispose方法 
 public static void Test()
 {
 using(MyClass auto = new MyClass()) 
 { /\* 使用auto对象 \*/ }
 // 因为使用了using句法，编译器自动调用auto.Dispose() 
 // 以上代码等效于: 
 MyClass user = new MyClass();
 try { /\* 使用user对象 \*/ }
 finally { user.Dispose(); }
 }
 }

```

引用和参考
-----

1. ↑ .  [2006-08-27]. （原始内容存档于2008-08-10）.
2. 1 2 3 4 .  [2008-08-29]. （原始内容存档于2009-01-22）.

外部链接
----

* ECMA C++/CLI标准



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：）
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* CFML（英语：）
* REBOL
	+ Red（英语：）
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh/ash
	+ csh/tcsh
	+ ksh
	+ bash
	+ zsh
	+ rc（英语：）
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
* TypeScript
* CoffeeScript/LiveScript（英语：）
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* Cg/HLSL
* GLSL
* Brook（英语：）
* OpenCL
	+ SYCL
* CUDA/PTX（英语：）
* Futhark
* SPIR-V（英语：）

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
|   | 

|  |  |
| --- | --- |
| 其它 | 
* 汇编语言
* APT（英语：）
* GPSS（英语：）
* dc
* make
* PostScript
* XSLT
* LLVM IR
* WebAssembly

 |

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
.NET |
| --- |
|  |
|  | 
* .NET(.NET CORE) 3
* .NET框架
* Mono
* Compact Framework
* Micro Framework
* Silverlight
* SSCLI
* DotGNU(Portable.NET)

 |
|  |
| 架構 | 
* 基礎類別庫
* 共同語言執行期元件
* 碼存取安全性
* 組件
* 中介資料
* COM互通性
* .NET標準

 |
|  |
| 共同語言基礎架構 | 
* 共同語言基礎架構（CLI）
* 共同型別系統
* 共同中介語言
* 虛擬執行系統

 |
|  |
| CLI語言 | 

|  |  |
| --- | --- |
| 共同語言1 | 
* C#
* Visual Basic .NET
* C++/CLI（Managed）
* F#
* J#
* JScript .NET
* PowerShell

 |
|  |
| 其他語言2 | 
* Axum
* A#
* Boo
* Oxygene
* IronLisp
* IronPython
* IronRuby
* Nemerle
* Phalanger
* P#

 |

 |
|  |
| Core家族3 | 
* ASP.NET Core (
* Entity Framework Core
* ASP.NET Core MVC )

 |
|  |
| 元件 | 
* ADO.NET (Entity Framework
* Data Services)
* ASP.NET (AJAX
* Dynamic Data
* MVC
* Razor)
* ClickOnce
* 动态语言运行时
* LINQ
* MAUI
* Parallel FX Library (PLINQ
* TPL)
* WCF
* Windows Forms
* WPF
* Windows CardSpace
* WF（WWF）
* Remoting
* XAML

 |
|  |
| 比較 | 
* C#与Java
* C#与Visual Basic .NET
* Java与.NET平台

 |
|  |
| 即將推出 | 
* "Acropolis"
* "Jasper"

 |
|  |
| 1微软在Visual Studio或.NET Framework中提供了或者将提供支持的语言2被多數使用者使用，且非教學或研究型的語言。3具有跨平台（Windows, Mac OSX, Linux）能力的開發框架。 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
C语言 |
| --- |
|  |
| 
* 《C程序设计语言》（K&R C）
* 历史
* ANSI C
* C99
* C11
* C18
* C23（英语：）
* 嵌入式C语言
* MISRA C

 |
|  |
| 特性 | 
* Functions
* 头文件
* 字符串
* 语法
* 预处理器
* 数据类型
* 指针

 |
|  |
| 函式庫 | 
* glibc
* C標準函式庫
* C POSIX library
* Dietlibc
* uClibc
* Newlib
* EGLIBC
* Bionic
* klibc
* musl

 |
|  |
| 編譯器 | 
* Clang
* GCC
* MSVC
* Intel C++
* Borland Turbo C
* LCC
* Pelles C
* PCC
* TCC
* C++/CLI
* C++/CX
* Watcom C/C++ 编译器

 |
|  |
| C與其他的程式語言 | 
* C与C++
	+ 兼容性
	+ 運算子
* Pascal与C的比较（英语：）
* C to Java byte-code compiler

 |
|  |
| 派生的程式語言 | 
* C++
* C#
* Objective-C
* D語言
* Alef（英语：）
* Limbo
* Go
* Vala

 |
|  |
| 
* C/C++的整合開發環境
* 分类 **分类**

 |

 |