跳转到内容

C++托管扩展

本页使用了标题或全文手工转换
维基百科,自由的百科全书

C++托管扩展(Managed Extensions for C++)是对C++的一个属性和关键字的扩展,以便于在微软公司.NET Framework进行编程。它也经常被称为托管C++。2002年由微软发布。

注意:C++托管扩展自Visual C++ 2005起被一个新的语言规范,正在标准化的C++/CLI所取代。

托管C++并非独立存在的编程语言,而仅仅是微软对C++的一个语法扩展,允许C++程序员在.NET框架和CLR的基础上进行托管编程。与C#Visual Basic .NET相比,其主要优点是旧代码可以比较快地移植到新的平台上,而且即使不完全重写代码,也可以通过互操作在同一个模块中无缝集成托管非托管代码,从新的.Net框架中获益。

.Net框架封装了大量的API,例如网络访问、字符串操作、数据访问、XML服务、图形界面控件库、邮件服务、加密服务、文件输入/输出,甚至是WMI管理,也使得应用程式员可以编写更加简洁的代码。目前只有托管C++及其后继者C++/CLI可以做到无缝集成托管非托管代码,而在托管代码中调用COM的速度又相当慢,所以经常被用于其他语言和非托管代码之间的桥梁。

托管C++允许程序员编写托管代码,内存管理的工作现在可以让CLR去自动处理,访问时也增加了类型检查,减少了缓冲区溢出内存泄漏的危险,增加了程序的稳定性,但是在性能敏感的应用中,庞大的.NET框架和缓慢的自动内存管理并不是必要的,传统非托管代码仍然是一些人的首选。

在面向对象编程方面,主要的变化是对多重继承的限制,这是因为CLR的限制和内存管理的需要。一个托管类不能多继承基类。同时,类属性和微软中间语言(MSIL)的引入也使得托管类可以在其他语言中使用和继承。

与此同时,托管C++引入了大量的关键字和语义转换,减少了代码的可读性和明确性。缺少在很多语言中都支持的泛型和for each语句也增加了其他语言的程序员转向托管C++的困难。在其后继者C++/CLI中泛型和for each语句才被支持。

Managed C++ 的重大改变

[编辑]

以下列出面向对象编程与 unmanaged C++ 之间的差异性。

  • (Global change) Existing C++ to be ported over the CLR must be appended with the following:
//hello.cpp

//new using directive
#using <mscorlib.dll>

//another using namespace directive.
using namespace System;

int main()  {
  Console::WriteLine("Hello");
  return 0;
}

一个新的前置处理引导(preprocessor directive)

   #using <mscorlib.dll>

这是必须的。此外 #using directives 必须用 namespace 的方法来 import 更多的函数库(libraries),像是 Base Class Library,例如:

  #using <System.Windows.Forms.dll>

以及

  using namespace System::Windows::Forms;

来使用 Windows Forms。

  • To compile code to target the CLR, a new compiler option must be introduced.
   cl.exe hello.cpp /clr

/clr enables any code referencing the .NET Framework to be compiled as CIL

  • A class can be designated to be garbage collected via the __gc extension keyword.
//gc.cpp

#using <mscorlib.dll>

__gc class gc  {
  int* i;
  char* g;
  float* j;
};

int main()  {
  while(true)  {
    gc* _gc = new gc();
  }
  return 0;
}

比较 Managed C++

[编辑]

以下列出 Managed C++ 与其它编程语言在类似观念上的差异。

...to Java

[编辑]

缺点

  • Java 几乎可支持所有的平台,而 Managed C++ 仅可以在 Windows 或其它实现出 .NET Framework 的平台上执行。
  • Java 代码复杂度较小,且易于阅读,并提供有代码使用文件可供参考。而 Managed C++ 则无。 (C++/CLI 于 Visual C++ .NET 2005 中已有支持)
  • Java 有许多开发工具与解决方案可提供开发者利用,Managed C++ 仅能使用 Visual Studio .NET。不过,Managed C++ applications 可用免费的 Visual C++ Toolkit 2003 编译。
  • Java 的例外机制是可以检查的(checked), Managed C++ 则无法检查。 (根据程序不同这也可能是个优点)

优点

  • Managed C++ 可以直接与系统低端(low level)服务接口沟通,Java 程序员必须使用 JNI (Java Native Interface) 与系统低端服务沟通。 (仅限Windows)
  • Managed C++ 是无法检查例外,Java 可以检查。. (根据程序不同这也可能是个缺点)

...to C#

[编辑]

缺点

  • 一如 Java, C# 的复杂度较小。而且 C# 可以直接支持 .NET Framework 。
  • C# 支持指针(pointers),如同 C++,这个机制默认是关掉的。



外部链接

[编辑]
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy