Що таке C ++ / CX і C ++ / CLI, і як вони відносяться до C ++ та WinRT?


31

Я розглядав питання щодо вивчення C ++ для розробки програм Metro, і саме тоді я натрапив на C ++ / CX.

Чи можна програмування Metro кодувати в C ++ 11? Чи потрібно C ++ / CX для роботи? А що саме таке C ++ / CX? Чи можливо створити додаток Metro, використовуючи лише C ++, або потрібен C ++ / CX? Крім того, як C ++ / CLI вкладається в цю картину?


Також використання C ++ / CX зараз перешкоджає (бажано C ++ / WinRT), дивіться документи
SWdV

Відповіді:


28

Microsoft звичайно робила систему C ++, яка дозволила вам отримати доступ до їх API Windows (званий win32), потім одного разу вони винайшли .NET і зрозуміли, що все повинно змінитися.

Таким чином, вони створили "Керовані розширення для C ++", які в основному були C ++, але з навантаженням нестандартних розширень, додаючи ключові слова, як __gcпідтримка функцій .NET (наприклад, виділення на купі GC, а не на рідній)

Але людям це не подобалося, як це було насправді; t C ++, маючи всі ці зайві ключові слова, тому Microsoft переробив його і назвав його C ++ / CLI, який мав набагато менший набір додаткових ключових слів, але ввів зміни синтаксису на зразок ^(тобто посилання 'вказівник' на об’єкт .NET на купі GC).

Через кілька років Microsoft зрозуміла, що .NET не є срібною кулею, про яку вони сказали, і вони також об'єднали свої бойові команди Windows та розробників. Частина цієї повторної оцінки призвела до створення абсолютно нового API Windows, який називається WinRT, це повністю нативний код, і це означало, що старі розширення вже не є корисними, тому Microsoft розробила свої розширення на C ++ до того, що зробило роботу з новою WinRT API простіше - зберігаючи кілька розширень від C ++ / CLI (наприклад, ^).

Отже - ось три, три різні версії розширеного C ++, що є поверхнево C ++. Принаймні остання версія знову є нативним кодом, тому вам не потрібно використовувати розширення, якщо ви не хочете, оскільки ви можете безпосередньо отримати доступ до API (він називається WRL і дуже схожий на старі класи шаблонів ATL)

Якщо ви думаєте, що ви можете кодувати міжплатформенний код, який вам не захочеться - ви можете змінювати дзвінки API, але ви не можете використовувати ^компілятор, окрім Visual C ++. Я рекомендую використовувати API WRL і зберігати свій код максимально стандартним, враховуючи "додатковий код", який вам потрібно буде написати в порівнянні з C ++ / CX, не так вже й чудово.


Примітка: C ++ / CX не згадується до кінця; непогано було б чітко сказати, хто з них у параграфі.
Жолудь

11

Посилаючись на http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . хоча C ++ / CX синтаксично схожий на C ++ / CLI і, таким чином, багато в чому виглядає майже однаково, він семантично зовсім інакше. Код C ++ / CX - це власний код, CLR не потрібен. Програмування в C ++ / CLI може бути дуже складним, оскільки треба спритно перемикати дві дуже різні об'єктні моделі одночасно: об'єктну модель C ++ та її детерміновані терміни експлуатації об'єкта та об'єктну модель CLI-об'єкта, зібрану зі сміттям. З C ++ / CX працювати набагато простіше, оскільки Windows Runtime, який базується на COM, дуже добре відображає мову програмування C ++.

Windows Runtime визначає порівняно простий, бінарний інтерфейс додатків низького рівня (ABI) та доручає, щоб компоненти визначали їх типи, використовуючи загальний формат метаданих. C ++ / CX не є строго необхідним для написання нативного компонента Windows Runtime: цілком можливо записати компоненти Windows Runtime за допомогою C ++ без використання розширень мови C ++ / CX, а Visual C ++ 2012 включає бібліотеку, бібліотеку шаблонів Windows + Runtime C ++ ( WRL), щоб полегшити це. Багато компонентів Windows Runtime, що постачаються як частина Windows (у просторі імен Windows), написані за допомогою WRL. У C ++ / CX немає ніякої магії: це просто робить написання компонентів Windows Runtime в C ++ набагато, набагато простіше і допомагає скоротити кількість повторюваних і багатослівних кодів, які вам доведеться писати, використовуючи рішення на основі бібліотеки, як WRL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.