O que são C ++ / CX e C ++ / CLI e como eles se relacionam com C ++ e WinRT?


31

Eu estava pensando em aceitar o desafio de aprender C ++ para projetar aplicativos Metro e foi aí que me deparei com C ++ / CX.

Os aplicativos Metro podem ser codificados em C ++ 11? Eles exigem C ++ / CX para funcionar? E o que exatamente é C ++ / CX? É possível criar um aplicativo Metro usando apenas C ++ ou é necessário C ++ / CX? Além disso, como o C ++ / CLI se vincula a essa imagem?


Além disso, o uso de C ++ / CX é desencorajado agora (C ++ / WinRT é o preferido), ver os documentos
SWdV

Respostas:


28

A Microsoft costumava criar um sistema C ++ que permitia acessar a API do Windows (chamada win32); então, um dia, eles inventaram o .NET e concluíram que tudo precisava mudar.

Então, eles criaram "Managed Extensions for C ++", que era basicamente C ++, mas com uma carga de extensões não padrão, adicionando palavras-chave como __gcsuporte aos recursos do .NET (como alocar no heap do GC em vez do nativo)

Mas as pessoas não gostaram disso, pois realmente não era; C ++, com todas essas palavras-chave extras, então a Microsoft a redesenhou e a chamou de C ++ / CLI, que tinha um conjunto muito menor de palavras-chave adicionais, mas introduziu alterações de sintaxe como a ^(que é um 'ponteiro' de referência para um objeto .NET no heap do GC).

Alguns anos depois, a Microsoft percebeu que o .NET não é a bala de prata que eles disseram que era, e eles também fundiram suas equipes de combate e Windows. Parte dessa reavaliação levou à criação de uma nova API do Windows, chamada WinRT, que é um código totalmente nativo e isso significava que as extensões antigas não eram mais úteis, então a Microsoft desenvolveu suas extensões C ++ para uma que funcionava com o novo API do WinRT mais fácil - mantendo algumas extensões do C ++ / CLI (como o ^).

Então, lá está você, 3 versões diferentes de um C ++ estendido que é superficialmente C ++. Pelo menos a versão mais recente é o código nativo novamente, então você não precisa usar as extensões se não quiser, pois pode acessar diretamente a API (é chamada WRL e é muito parecida com as antigas classes de modelos ATL)

Se você acha que pode estar codificando código de plataforma cruzada, não deseja - pode alterar as chamadas da API, mas não pode usar o ^em nenhum compilador que não seja o Visual C ++. Eu recomendo usar a API WRL e manter seu código o mais padrão possível, dado o 'código extra' que você precisa escrever em comparação com C ++ / CX não é tão bom.


Nota: C ++ / CX não é mencionado até o final; seria bom dizer explicitamente qual deles está em seu parágrafo.
Bolota

11

Citando http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . enquanto o C ++ / CX é sintaticamente semelhante ao C ++ / CLI e, portanto, parece quase o mesmo de várias maneiras, é semanticamente bem diferente. O código C ++ / CX é nativo, sem necessidade de CLR. A programação em C ++ / CLI pode ser muito desafiadora, pois é necessário manipular habilmente dois modelos de objetos muito diferentes ao mesmo tempo: o modelo de objeto C ++ com sua vida útil determinística e o modelo de objeto CLI coletado por lixo. O C ++ / CX é muito mais simples de trabalhar, porque o Windows Runtime, que é baseado no COM, mapeia muito bem a linguagem de programação C ++.

O Windows Runtime define uma ABI (Application Binary Interface) de nível inferior e exige que os componentes definam seus tipos usando um formato de metadados comum. O C ++ / CX não é estritamente necessário para gravar um componente nativo do Windows Runtime: é bem possível gravar componentes do Windows Runtime usando C ++ sem usar as extensões de linguagem C ++ / CX, e o Visual C ++ 2012 inclui uma biblioteca, a Biblioteca de Modelos do Windows Runtime C ++ ( WRL), para ajudar a tornar isso mais fácil. Muitos dos componentes do Windows Runtime fornecidos como parte do Windows (no espaço de nome do Windows) são gravados usando o WRL. Não há mágica no C ++ / CX: ele simplifica muito a escrita dos componentes do Windows Runtime no C ++ e ajuda a reduzir a quantidade de código repetitivo e detalhado que você precisaria escrever ao usar uma solução baseada em biblioteca como o WRL.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.