C++/CX (C++ component extension, estensione dei componenti) è un'estensione di linguaggio per i compilatori C++ di Microsoft che consente ai programmatori C++ di scrivere programmi per la piattaforma Windows Runtime.

Le estensioni del linguaggio prendono in prestito la sintassi da C++/CLI ma non la sua semantica. Il C++/CX è codice nativo e mira alla compatibilità con Windows Runtime Universal Windows Platform invece del codice gestito del Common Language Runtime.

Queste estensioni non sono l'unico modo di utilizzare le interfacce Windows Runtime: è possibile interagire con Windows Runtime con un qualsiasi compilatore C++ standard tramite la libreria Windows Runtime C++ Template Library (WRL), o la più recente WinRT.

Sintassi delle estensioni

Oggetti

Nel linguaggio C++/CX gli oggetti WinRT vengono creati (o attivati) usando ref new e assegnati alle variabili dichiarate con la notazione ^ (hat) ereditata da C++/CLI.Foo^ foo = ref new Foo();Una variabile WinRT è semplicemente una coppia di puntatori, uno alla tabella dei metodi virtuali e uno ai dati interni dell'oggetto.

Reference Counting Un oggetto WinRT è tracciato tramite reference counting e quindi si comporta in modo simile agli ordinari oggetti C++ racchiusi in shared_ptr. Un oggetto verrà cancellato quando non ci sono riferimenti ad esso.

Non è prevista garbage collection. Tuttavia, la parola chiave gcnew è stata riservata per un possibile uso futuro.

Classi

Classi runtime Esistono tipi speciali di classi runtime che possono contenere costrutti di estensione dei componenti. Queste sono semplicemente chiamate classi di riferimento perché sono dichiarate usando class ref.public ref class MyClass {

Classi parziali C++/CX introduce il concetto di classi parziali. La funzionalità consente di dividere una singola classe su più file, principalmente per abilitare gli strumenti di progettazione dell'interfaccia utente grafica XAML a generare automaticamente il codice in un file separato, al fine di non compromettere la logica scritta dallo sviluppatore. Le parti sono successivamente unite durante la compilazione.

I linguaggi .NET come C# hanno questa funzione da molti anni. Le classi parziali non esistono nel C++ standard e non possono quindi essere utilizzate.

Il seguente è un file che viene generato e aggiornato dal progettista della GUI e che pertanto non dovrebbe essere modificato dal programmatore. Si noti la parola chiave partial.// Foo.private.h #pragma once

using Platform::String;

partial ref class Foo { private: int id; String^ name; };Il seguente è il file in cui il programmatore scrive la logica dell'interfaccia utente. L'intestazione in cui viene definita la parte generata dalla compilazione della classe viene importata. Si noti che la parola chiave partial non è necessaria.// Foo.public.h #pragma once #include "Foo.private.h"

using Platform::String;

ref class Foo { public: int getId(); String^ getName(); };Questo è il file in cui sono implementati i membri della classe parziale.// Foo.cpp #include "pch.h" #include "Foo.public.h"

using Platform::String;

int Foo::getId() { return id; }

String^ Foo::getName() { return name; }

Generics Windows Runtime e quindi C++/CX supportano i generici a runtime. Le informazioni di tipo generico sono contenute nei metadati e istanziate in fase di runtime, diversamente dai template C++ che sono istanziati in fase di compilazione. Entrambi sono supportati dal compilatore e possono essere combinati.generic <typename T> public ref class Bag { property T Item;

Metadati

Tutti i programmi WinRT espongono le loro classi e membri dichiarati attraverso dei metadati. Il formato è lo stesso standardizzato come parte della Common Language Infrastructure (CLI), lo standard creato dal Framework .NET. Per questo motivo, il codice può essere condiviso tra C++/CX, i linguaggi CLI e JavaScript che si rivolgono a Windows Runtime.

Libreria di runtime Il C++/CX ha un set di librerie che hanno come target Windows Runtime. Questi aiutano a collegare le funzionalità della libreria standard C++ e WinRT.

Rilevamento tramite preprocessore È possibile rilevare se l'estensione C++/CX è attivata testando l'esistenza del simbolo del preprocessore __cplusplus_winrt.#ifdef __cplusplus_winrt // C++/CX specific code goes here... #endif

Note

Collegamenti esterni

Categoria:C++