Articulo de referencia

C++/CLI

C++/CLI es una variante del lenguaje de programación C++ , modificada para la Infraestructura de Lenguaje Común (CLI) . Forma parte de Visual Studio 2005 y versiones posteriores...

C++/CLI es una variante del lenguaje de programación C++ , modificada para la Infraestructura de Lenguaje Común (CLI) . Forma parte de Visual Studio 2005 y versiones posteriores, y proporciona interoperabilidad con otros lenguajes .NET como C# . Microsoft creó C++/CLI para reemplazar las Extensiones Administradas para C++ . En diciembre de 2005, Ecma International publicó las especificaciones de C++/CLI como el estándar ECMA-372 . [ 1 ]

La última versión de C++ compatible con C++/CLI es C++20 . [ 2 ]

Cambios de sintaxis

C++/CLI debe considerarse un lenguaje propio (con un nuevo conjunto de palabras clave, por ejemplo), en lugar del C++ administrado (MC++) orientado al superconjunto de C++ (cuyas palabras clave no estándar tenían un estilo similar __gca o __value). Debido a esto, existen algunos cambios sintácticos importantes, especialmente relacionados con la eliminación de identificadores ambiguos y la adición de características específicas de .NET.

Muchas sintaxis conflictivas, como las múltiples versiones del operador en MC++, se han dividido: en C++/CLI, los tipos de referencia de .NET se crean con la palabra clave new (es decir, se eliminan mediante recolección de basura ). Además, C++/CLI ha introducido el concepto de genéricos de .NET (similares, para los fines más comunes, a las plantillas estándar de C++, pero bastante diferentes en su implementación).new()gcnewnew()

C++/CLI utiliza array<T>para referirse al array nativo de C# T[], mientras que utiliza System::Array<T>para referirse a la clase contenedora System.Array<T>en C#.

Mangos

En MC++, existían dos tipos de punteros : __nogclos punteros C++ estándar y __gclos punteros que funcionaban con tipos de referencia .NET. En C++/CLI, sin embargo, el único tipo de puntero es el puntero C++ estándar, mientras que a los tipos de referencia .NET se accede mediante un identificador, con la nueva sintaxis ClassName^(en lugar de ClassName*). Esta nueva construcción resulta especialmente útil cuando se mezcla código C++ administrado y estándar; aclara qué objetos están sujetos a la recolección automática de basura de .NET y qué objetos el programador debe recordar destruir explícitamente.

Referencias de seguimiento

En C++/CLI, una referencia de seguimiento es un identificador de una variable pasada por referencia. Su concepto es similar al de usar *&`<pointer>` (referencia a un puntero) en C++ estándar, y en las declaraciones de funciones corresponde a la refpalabra clave `<type>` aplicada a los tipos en C# o ByRefen Visual Basic .NET . C++/CLI utiliza una ^%sintaxis específica para indicar una referencia de seguimiento a un identificador.

El siguiente código muestra un ejemplo del uso de referencias de seguimiento. Si se reemplaza la referencia de seguimiento por una variable de identificador normal, el array de cadenas resultante tendría 10 identificadores de cadena sin inicializar, ya que solo se establecerían copias de los identificadores de cadena del array, debido a que se pasan por valor en lugar de por referencia.

usando el espacio de nombres Sistema ;int main () { array < String ^>^ arr = gcnew array < String ^> ( 10 ); int i = 0 ;para cada ( String ^% s en arr ) { s = i ++ . ToString (); }devolver 0 ; }

Finalizadores y variables automáticas

Otro cambio en C++/CLI es la introducción de la sintaxis del finalizador ; para una clase X, su finalizador es !X(), un tipo especial de destructor no determinista que se ejecuta como parte de la rutina de recolección de basura . La sintaxis del destructor de C++ ~X()también existe para objetos administrados y refleja mejor la semántica "tradicional" de C++ de destrucción determinista (es decir, destructores que pueden ser llamados por código de usuario con delete).

En el paradigma .NET puro, el modelo de destrucción no determinista sobrescribe el Finalize()método protegido de la System::Objectclase raíz, mientras que el modelo determinista se implementa a través del método System::IDisposablede interfazDispose() (en el que el compilador C++/CLI convierte el destructor). Los objetos de código C# o VB.NET que sobrescriben el método Dispose pueden eliminarse manualmente en C++/CLI, al deleteigual que las clases .NET en C++/CLI.

espacio de nombres Wikipedia :: Ejemplos {// C++/CLI ref class MyClass { protected : ! MyClass (); // finalizador (destructor no determinista) (implementado como Finalize()) public : MyClass (); // constructor ~ MyClass (); // destructor (determinista) (implementado como IDisposable.Dispose()) static void Test () { MyClass automatic ; // No es un identificador, no hay inicialización: el compilador llama al constructor aquí MyClass ^ user = gcnew MyClass (); delete user ;// El compilador llama al destructor de automatic cuando automatic sale del ámbito } };}

Sobrecarga del operador

La sobrecarga de operadores funciona de forma análoga a la de C++ estándar. Cada ` *ref` se convierte en un `ref` , cada ` ref` en un ` ref`, pero el resto de la sintaxis permanece inalterada, salvo por una importante adición: para las clases .NET, la sobrecarga de operadores es posible no solo para las clases en sí, sino también para las referencias a esas clases. Esta característica es necesaria para que una clase de referencia tenga la semántica de sobrecarga de operadores esperada de las clases de referencia de .NET. (A la inversa, esto también significa que para las clases de referencia del framework .NET, la sobrecarga de operadores de referencia suele estar implementada implícitamente en C++/CLI). ^&%

Por ejemplo, comparar dos referencias de cadena distintas ( System::String^) mediante el operador ==dará verdadero siempre que las dos cadenas sean iguales. Sin embargo, la sobrecarga del operador es estática. Por lo tanto, convertir a System::Object^eliminará la semántica de sobrecarga.

usando el espacio de nombres Sistema ;// Efectos de la sobrecarga del operador de referencia String ^ s1 = "abc" ; String ^ s2 = "ab" + "c" ; Object ^ o1 = s1 ; Object ^ o2 = s2 ; s1 == s2 ; // verdadero o1 == o2 ; // falso

Interoperabilidad

C++/CLI permite que los programas C++ consuman programas C# en DLL de C#. [ 3 ] Aquí la #usingdirectiva muestra al compilador dónde se encuentra la DLL para sus metadatos de compilación. Este sencillo ejemplo no requiere serialización de datos .

importar "stdafx.h" ;#usando "Wikipedia.Examples.dll"using namespace System ; using namespace Wikipedia :: Examples ;int main ( array < String ^>^ args ) { double x = Class1 :: Add ( 40.1 , 1.9 ); return 0 ; }

El contenido del código fuente C# de Wikipedia.Examples.dll :

espacio de nombres Wikipedia.Ejemplos ;public class Class1 { public static double Add ( double a , double b ) { return a + b ; } }

Este ejemplo muestra cómo se serializan las cadenas de C++ std::stringa cadenas de .NET System.Stringy luego se vuelven a serializar a C++. La serialización de cadenas copia el contenido de la cadena a formatos utilizables en los diferentes entornos.

import < string > ; import < iostream > ; import < msclr \ marshal_cppstd . h > ; import "stdafx.h" ;#usando "Wikipedia.Examples.dll"// El espacio de nombres std se deja sin importar para distinguirlo de los tipos .NET usando el espacio de nombres System ; usando el espacio de nombres Wikipedia :: Examples ;int main () { std :: string s = "Soy un gato" ; String ^ clrString = msclr :: interop :: marshal_as < String ^> ( s ); // cadena utilizable desde C# (System::String) String ^ t = Class1 :: Process ( clrString ); // llamar a la función de C# std :: string cppString = msclr :: interop :: marshal_as < std :: string > ( t ); // cadena utilizable desde C++ std :: cout << "¡Hola, C++/C# Interop!" << std :: endl ; std :: cout << cppString << std :: endl ; return 0 ; }

El código C# no tiene en absoluto en cuenta C++.

espacio de nombres Wikipedia.Ejemplos ;public class Class1 { public static string process ( string a ) { return a . Replace ( "cat" , "dog" ) + " with a tail" ; } }

La interoperabilidad entre C++ y C# permite, por lo tanto, un acceso simplificado de C++ a todas las características de .NET.

C++/CX

C++/CX dirigido a WinRT , aunque produce código completamente no administrado, toma prestada la sintaxis refy ^para los componentes con conteo de referencias de WinRT, que son similares a los "objetos" COM . [ 4 ]

Véase también

Referencias

  1. "ECMA-372" . ecma-international.org . Ecma International . Diciembre de 2005. Archivado del original el 10 de agosto de 2008.
  2. Tanveer Gani (16 de mayo de 2023). "Llega la compatibilidad con C++20 a C++/CLI" . devblogs.microsoft.com . Blogs de desarrolladores de Microsoft.
  3. Uso de la interoperabilidad con C++ (PInvoke implícito)
  4. Dentro del diseño de C++/CX - Blog del equipo de Visual C++ - Página principal - Blogs de MSDN

Lecturas adicionales

  • Sutter, Herb (23 de noviembre de 2003). "Palabras clave de C++/CLI: Un vistazo al funcionamiento interno" . Blog de Herb Sutter . Microsoft . Archivado del original el 9 de noviembre de 2007.
  • Sutter, Herb (24 de febrero de 2006). "Una justificación de diseño para C++/CLI" (PDF) . Publicado por el propio autor .
  • Stroustrup, Bjarne (23 de julio de 2021). "¿Qué opinas de C++/CLI?" . Preguntas frecuentes de Bjarne Stroustrup . Publicado por el autor .
  • Lippman, Stanley . "C++ puro: Hola, C++/CLI" . Revista MSDN . 21 (3). Microsoft . Archivado del original el 5 de febrero de 2008.
  • Lippman, Stanley (5 de agosto de 2004). "Por qué C++/CLI admite tanto plantillas para tipos CLI como el mecanismo genérico CLI" . Blog de Stan Lippman . Microsoft . Archivado del original el 7 de octubre de 2007.
  • Sitio web oficial
  • Patente relativa a los espacios en blanco en las palabras clave
Obtenido de " https://en.wikipedia.org/w/index.php?title=C%2B%2B/CLI&oldid=1359583074 "