首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

解析 C++/CLI:標頭檔、內聯函數與陣列 (無標頭檔、程序集共享)

     編輯:VC 教學

標頭檔與函數宣告:C++/CLI 無標頭檔模型

傳統 C++ 以標頭檔 (.h) 共享型別定義,各 .cpp 獨立編譯再鏈結。C++/CLI 採用程序集 (Assembly, .dll/.exe) 共享中繼資料:

  • 型別 (如 Point) 編譯為 Point.dll,包含完整中繼資料 (型別、方法、屬性、簽章)。
  • 使用者專案需 #using 參考該程序集,編譯器直接讀取中繼資料,無需標頭檔。
  • 所有成員函數**必須在同一源檔定義** (除非標記 inline),否則鏈結器報錯 (因定義與宣告在同一編譯單元)。

範例:非內聯成員函數必須同檔定義

// Point.cpp (編譯為 Point.dll)
public ref class Point {
    int X, Y;
public:
    Point(int x, int y) : X(x), Y(y) {}
    virtual int GetHashCode() override; // 宣告
};

int Point::GetHashCode() override { // 定義:必須在同一 .cpp
    return X ^ (Y << 1);
}

若將定義移至 Point2.cpp 並與 Point.cpp 同編譯單元 → 錯誤:編譯 Point2.cpp 時需參考 Point.dll,但 Point.dll 正是當前編譯產出物,循環依賴。

內聯函數

標記 inline 的成員函數可在類別定義內或類別外同檔定義,編譯器將其內展開,不產生獨立符號,避免上述循環依賴。C++/CLI 專案常大量使用 inline 保持彈性。

CLI 陣列

  • 語法:array^ arr = gcnew array(10); (堆上)。
  • 不能 建立堆疊語意陣列 (array arr(10); 錯誤)。
  • 多維:array^ m = gcnew array(3,4);。
  • 陣列為參考型別,受 GC 管理,支援 Length, Rank, GetLength(d) 等屬性/方法。

此設計簡化了跨語言互操作 (無標頭檔同步問題),但要求開發者適應「單元即模組」的編譯模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved