2010-08-23 12 views
8

Tengo una larga lista de constantes a las que necesito acceso en varios proyectos que están en diferentes idiomas (Verilog, C, C++ y C#). En lugar de repetirlos en cada idioma, ¿hay una buena forma de compartirlos?Compartir constantes en todos los idiomas

Lo único que podría pensar sería un archivo de texto y un script de preprocesamiento? ¿Es esta la mejor solución o hay algo más fácil/más elegante?

+0

víctima parcial de: http://stackoverflow.com/questions/954321/is-it-possible- to-share-an-enum-declaration-between-c-and-unmanaged-c –

Respuesta

0

Puede tener un archivo XML con las constantes para compartir y hacer que se analice en cada idioma.

+1

Eso le dará valores de tiempo de ejecución, no constantes de tiempo de compilación. –

+10

XML es como violencia: si no funciona, usa más. –

9

Una secuencia de comandos de preproceso que actualiza automáticamente esas constantes dentro de su código es probablemente el mejor método. Confirme el código con su proyecto para garantizar la corrección y hacer que forme parte del script de compilación.

+0

Esto es lo que solíamos hacer en mi trabajo anterior (mezcla de C, VHDL, ensamblador y Matlab). Sin embargo, tenga en cuenta que los casos especiales se acumulan rápidamente si quiere hacer algo más complicado que constantes enteras simples (por ejemplo, poder especificar cosas en hexadecimal, constantes definidas en términos de otras). –

+0

El macroprocesador M4 podría ser una buena opción. – caf

6

Puede guardarlos en un documento XML y escribir scripts XSLT para cada idioma para generar los archivos fuente apropiados en cada compilación.

+0

Creo que es una solución excelente, también permitiría el manejo de casos especiales. Y es extensible. – JBRWilkinson

1

¿Se puede utilizar su archivo MAKE (o equivalente) para definir estas constantes? Para C y C++. puede usar las opciones de la CLI del compilador para definir los valores del preprocesador para las constantes. No he hecho mucha personalización de compilación para Verilog, pero sospecho que algo similar podría existir allí también.

1

puede escribir un simple archivo en forma de

const1 = value1 
const2 = value2 
const3 = value3 

y luego aplicar algo parecido, para c:

s/\([a-zA-Z][a-zA-Z1-9_]*\)[ \t]*=[ \t]*\(.*\)/#define \1 \2/

Vale la pena señalar que es posible que tenga que especificar tipos, porque no todos los idiomas le permitirán utilizar una macro preprossessor que no se preocupa por el tipo.

Como alternativa, puede hacer un lexer/analizador en Flex/Bison para analizar el archivo de configuración. Esto será más claro y más fácil de extender.

0

Para Verilog (al menos para Verilog sistema) y C++ usted puede tener todas las constantes descrito como una lista (suponiendo que todos ellos son del mismo tipo), como la siguiente:

a=0, b= 1, c = 2, ..; 

en C++ que usaría

const int 
#include <myconsts> 

en verilog (al menos en verilog sistema) puede utilizar esta

parameter int 
`include "myconsts" 

Supongo que C# no tiene incluye. Por lo tanto, necesitaría un script de preprocesamiento allí al menos para incluir sus constantes en una clase. Es posible que pueda usar 'cpp' para esto. Lo siento, no sé mucho sobre C#.

En realidad, para hacer todas similares utilizaría probablemente CPP para generar el archivo que necesito:

#ifdef CPP 
    const int 
#elsif VERILOG 
    parameter int 
#elsif CSHARP 
    class Constants { 
     const int 
#endif 

    a = 0, 
    c = 1, 
    d = 2; 

#ifdef(CSHARP) 
    }; 
#endif 
Cuestiones relacionadas