Pregunta

Tengo un archivo en C ++ que contiene definiciones constantes, quiero usar las mismas definiciones en un proyecto de C #. Dado que ambos proyectos son parte de un proyecto más grande, quiero que si hay un cambio (adición / eliminación) en el archivo C ++, también se refleje en el archivo C # correspondiente. Quiero mantener los 2 archivos sincronizados. Me preguntaba si hay un script / herramienta para hacer esto.

Una solución inversa (C # - > C ++) también funcionaría.

Aclaración:

Actualmente el código es:

//C++ 
    struct Colors{ 
         static const int Red = 100; //Custom Values are important 
         static const int Green = 101; } 
//C#

public enum Color{ Red = 100; Green =101; }

Ahora quiero tener un solo archivo para que cualquier cambio en C ++ se refleje en C # (o al revés) para que pueda tener un solo archivo en los proyectos para estas constantes.

Como puede ver, quiero asignar un montón de constantes definidas en una estructura en C ++ a una enumeración en C #. Quiero hacer cambios mínimos / nulos en las definiciones esperadas anteriores, ya que hay otro código dependiente (en ambos proyectos) de las estructuras anteriores (pero podría hacerlo, si no hay una buena manera de lograr esto en el formato actual)

¿Fue útil?

Solución

Probablemente no encuentres un script ... Debes tener tu propio script para hacer esto. De lo contrario, los MACRO son la mejor opción ...
Si tiene un script, puede crear una regla en su archivo MAKE que ejecutará automáticamente este script cada vez que cree su proyecto.

Otros consejos

¿Por qué no toma el archivo de constantes y lo empaqueta por separado como un ensamblaje similar a App.Constants.dll y los proyectos de C # y C ++ hacen referencia a ellos? De esta manera, puede hacer cambios en un solo lugar. Tenga referencias basadas en proyectos para facilitarlo en Visual Studio.

Suponiendo constantes enteras simples y demás, debería ser posible reutilizar el mismo archivo fuente utilizando el preprocesador de forma creativa. Algo como esto:

#if CSHARP
public class Constants {
#else
#  define public
#endif

// Easy stuff
public const int FOO = 1;
public const int BAR = 2;

// Enums can be done too, but you have to handle the comma
public enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE }
#if !CSHARP
;
#endif

#if CSHARP
}
#else
#  undef public
#endif

Es posible que necesite typedefs para algunos tipos para que sus nombres coincidan (por ejemplo, typedef unsigned int uint ).

Luego compila el código como parte de su proyecto C # con / define: CSHARP , y también #include en algún encabezado C ++ sin definiciones adicionales.

Lo que desea hacer es crear una biblioteca administrada de C ++ que contenga las constantes y enumeraciones en un formato que sea reutilizable tanto en C ++ como en C # no administrados.

Versión gestionada:

//managed.cpp
#define MAKECONST(name, value) public const int ##name = ##value; 

public enum class FruitType
{
    #include "FruitType.h"
};

pubilc ref class Constants {
   #include "const.h"
};

Versión no administrada:

//unmanaged.cpp
#define MAKECONST(name, value) const int ##name = ##value;

enum FruitType
{
    #include "FruitType.h"
};

#include "const.h"

Las definiciones de enumeración reales:

//FruitType.h
Apple = 1,
Banana,
Lychee

El archivo consts:

//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)

Un método automatizado para hacerlo es usar SWIG para convertir su código C ++ a C #.

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