傳統 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 保持彈性。
array^ arr = gcnew array(10); (堆上)。array arr(10); 錯誤)。array^ m = gcnew array(3,4); 。Length, Rank, GetLength(d) 等屬性/方法。此設計簡化了跨語言互操作 (無標頭檔同步問題),但要求開發者適應「單元即模組」的編譯模型。