C ++ / CX và C ++ / CLI là gì và chúng liên quan đến C ++ và WinRT như thế nào?


31

Tôi đã xem xét việc chấp nhận thử thách học C ++ để thiết kế các ứng dụng Metro và đó là khi tôi bắt gặp C ++ / CX.

Các ứng dụng Metro có thể được mã hóa trong C ++ 11 không? Họ có yêu cầu C ++ / CX để làm việc không? Và chính xác thì C ++ / CX là gì? Có thể tạo ứng dụng Metro chỉ bằng C ++ hay C ++ / CX là bắt buộc? Ngoài ra, làm thế nào để C ++ / CLI gắn vào bức tranh này?


Ngoài ra, việc sử dụng C ++ / CX hiện không được khuyến khích (ưu tiên sử dụng C ++ / WinRT), xem tài liệu
SWdV

Câu trả lời:


28

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 __gchỗ 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.


Lưu ý: C ++ / CX không được đề cập cho đến khi kết thúc; sẽ thật tốt khi nói rõ ràng cái nào trong đoạn văn của nó.
Acorn

11

Trích dẫn http://bloss.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anint sinhtion.aspx :

. . . trong khi C ++ / CX về mặt cú pháp tương tự như C ++ / CLI và do đó trông gần giống nhau theo nhiều cách, nó hoàn toàn khác nhau về mặt ngữ nghĩa. Mã C ++ / CX là mã gốc, không yêu cầu CLR. Lập trình trong C ++ / CLI có thể rất khó khăn, vì người ta phải khéo léo xử lý hai mô hình đối tượng rất khác nhau cùng một lúc: mô hình đối tượng C ++ với thời gian sống đối tượng xác định và mô hình đối tượng CLI được thu gom rác. C ++ / CX hoạt động đơn giản hơn nhiều, vì Windows Runtime, dựa trên COM, ánh xạ rất tốt đến ngôn ngữ lập trình C ++.

Windows Runtime định nghĩa một Giao diện nhị phân ứng dụng cấp thấp (ABI) tương đối đơn giản và bắt buộc các thành phần xác định loại của chúng bằng định dạng siêu dữ liệu phổ biến. C ++ / CX không bắt buộc phải viết một thành phần Windows Runtime nguyên bản: hoàn toàn có thể viết các thành phần Windows Runtime bằng C ++ mà không cần sử dụng các phần mở rộng ngôn ngữ C ++ / CX và Visual C ++ 2012 bao gồm một thư viện, Thư viện mẫu Windows Runtime C ++ ( WRL), để giúp làm điều này dễ dàng hơn. Nhiều thành phần Windows Runtime vận chuyển như một phần của Windows (trong không gian tên Windows) được viết bằng WRL. Không có phép thuật nào trong C ++ / CX: nó chỉ giúp viết các thành phần Windows Runtime trong C ++, đơn giản hơn nhiều và giúp cắt giảm số lượng mã lặp đi lặp lại và dài dòng mà bạn sẽ phải viết khi sử dụng giải pháp dựa trên thư viện như WRL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.