Pregunta

Quiero escribir una biblioteca usando la sintaxis C ++/CX y usarla en otros proyectos.

Como saben, las estructuras de datos antiguas no pueden tener ningún método u operador, por lo que tuvimos que hacer cosas como escribir métodos estáticos en otra clase para proporcionar comportamiento.

También no podemos escribir código como este:

private:
    int _D;
public:
    property int& D { int& get() {return _D;}}

o pasar esta propiedad a métodos como este:

void SampleMethod(int& d);

No sé por qué la biblioteca de tiempo de ejecución de Windows tiene estas restricciones.

¿Cómo puedo compilar las extensiones de tiempo de ejecución C ++/CX y Windows en un archivo .lib? ¿O cómo precompilar los archivos de código de todo el proyecto WRL en otro proyecto?

¿Fue útil?

Solución

WinRT es un ABI destinado al uso de lenguaje cruzado: al menos C ++, C#, VB y JS. Por esta razón, las construcciones que proporciona se limitan a lo que se puede representar en esos idiomas de una manera directa, por ejemplo, si devuelve por referencia, ¿cómo lo usaría el código C#?

Si desea escribir una biblioteca estática en C ++ para el consumo solo de C ++, mi consejo sería evitar las extensiones de lenguaje en la medida de lo posible, y solo mantenerlas para aquellos lugares donde tiene que pasar objetos WinRT. No hay ningún beneficio que obtendrá en ese escenario de ir a C ++/CX completo.

Otros consejos

A diferencia de C ++, donde una "estructura" es básicamente "una clase donde todos los miembros son públicos", en el tiempo de ejecución de Windows, una "estructura" es un tipo de valor. Como tal, no puede tener ningún método, incluidos los accesorios de propiedades (los tipos de valor no pueden tener métodos).

Además, debido a que las estructuras son tipos de valor, siempre se pasan por valor. Esto significa que pasar una estructura a un método requiere copiar el contenido de la estructura (un tipo de valor implica que cada consumidor opera con su propia copia del tipo de datos). Como consecuencia de esto, las estructuras deben ser bastante pequeñas (piense "menos de 16 bytes").

Si necesita pasar por los objetos más grandes, use una clase en su lugar: las clases se pasan por referencia y, por lo tanto, pueden contener cualquier cantidad de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top