跳至內容

英文维基 | 中文维基 | 日文维基 | 草榴社区

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++,這個機制預設是關掉的。



外部連結

[編輯]