Что такое 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 ++, которая позволяла бы вам получить доступ к их Windows API (называемому win32), затем однажды они изобрели .NET и решили, что все должно измениться.

Поэтому они создали «Managed Extensions for C ++», который был в основном C ++, но с множеством нестандартных расширений, добавляя ключевые слова, например, __gcдля поддержки функций .NET (например, распределение в куче GC, а не в собственной).

Но людям это не понравилось, так как на самом деле это не было C ++, имея все эти дополнительные ключевые слова, поэтому Microsoft перепроектировала его и назвала его C ++ / CLI, который имел гораздо меньший набор дополнительных ключевых слов, но представил изменения синтаксиса, такие как ^(который является ссылка «указатель» на объект .NET в куче GC).

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

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

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

gbjbaanb
источник
Примечание: 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, основанная на COM, очень хорошо отображается на язык программирования C ++.

Среда выполнения Windows определяет относительно простой низкоуровневый двоичный интерфейс приложения (ABI) и предписывает компонентам определять их типы с использованием общего формата метаданных. C ++ / CX не требуется строго для написания собственного компонента среды выполнения Windows: вполне возможно писать компоненты среды выполнения Windows с использованием C ++ без использования языковых расширений C ++ / CX, а Visual C ++ 2012 включает в себя библиотеку Windows Library Runtime C ++ Template Library ( WRL), чтобы помочь сделать это проще. Многие из компонентов среды выполнения Windows, которые поставляются как часть Windows (в пространстве имен Windows), написаны с использованием WRL. В C ++ / CX нет ничего волшебного: он просто делает написание компонентов среды выполнения Windows на C ++ намного проще и помогает сократить объем повторяющегося и подробного кода, который вам придется писать при использовании основанного на библиотеках решения, такого как WRL.

Matt
источник