Microsoft thường chỉ tạo ra một hệ thống C ++ cho phép bạn truy cập API Windows của họ (được gọi là win32), rồi một ngày họ phát minh ra .NET và nhận ra mọi thứ phải thay đổi.
Vì vậy, họ đã tạo ra "Phần mở rộng được quản lý cho C ++" về cơ bản là C ++ nhưng với vô số phần mở rộng không chuẩn, thêm từ khóa muốn __gc
hỗ trợ các tính năng .NET (như phân bổ trên heap của GC chứ không phải bản gốc)
Nhưng mọi người không thích điều này vì nó thực sự không phải là C ++, có tất cả các từ khóa bổ sung đó, vì vậy Microsoft đã thiết kế lại nó và gọi nó là C ++ / CLI, có một bộ từ khóa bổ sung nhỏ hơn nhiều nhưng lại đưa ra các thay đổi cú pháp như ^
(đó là một 'con trỏ' tham chiếu đến một đối tượng .NET trên heap GC).
Vài năm sau và Microsoft đã nhận ra .NET không phải là viên đạn bạc mà họ nói, và họ cũng đã hợp nhất các nhóm Windows và Developer đang chiến đấu của họ. Một phần của việc đánh giá lại này đã dẫn đến việc tạo ra một API Windows hoàn toàn mới, được gọi là WinRT, đó hoàn toàn là mã gốc và điều này có nghĩa là các tiện ích mở rộng cũ không còn hữu ích nữa, vì vậy Microsoft đã phát triển các tiện ích mở rộng C ++ của chúng để làm việc với công cụ mới API WinRT dễ dàng hơn - bằng cách giữ một vài tiện ích mở rộng từ C ++ / CLI (chẳng hạn như ^).
Vì vậy, có bạn đi, 3 phiên bản khác nhau của một C ++ mở rộng là C ++ bề ngoài. Ít nhất phiên bản mới nhất là mã gốc một lần nữa, vì vậy bạn không cần sử dụng các tiện ích mở rộng nếu bạn không muốn vì bạn có thể truy cập trực tiếp API (nó được gọi là WRL và rất giống với các lớp mẫu ATL cũ)
Nếu bạn nghĩ rằng bạn có thể đang mã hóa mã đa nền tảng mà bạn không muốn - bạn có thể thay đổi các lệnh gọi API, nhưng bạn không thể sử dụng ^
trình biên dịch trên bất kỳ trình biên dịch nào khác ngoài Visual C ++. Tôi khuyên bạn nên sử dụng API WRL và giữ mã của bạn ở mức chuẩn nhất có thể với 'mã bổ sung' bạn cần viết so với C ++ / CX không quá tuyệt vời.