2010-08-23 5 views
8

Ich habe eine lange Liste von Konstanten, auf die ich in mehreren Projekten in verschiedenen Sprachen (Verilog, C, C++ und C#) zugreifen muss. Anstatt sie in jeder Sprache zu wiederholen, gibt es eine gute Möglichkeit, diese zu teilen?Gemeinsame Konstanten für alle Sprachen

Das Einzige, woran ich denken könnte, wäre eine Textdatei und ein Vorverarbeitungsskript? Ist das die beste Lösung oder gibt es etwas einfacheres/eleganteres?

+0

Teil Betrogene von: http://stackoverflow.com/questions/954321/is-it-possible- to-share-an-enum-declaration-zwischen-c-und-unmanaged-c –

Antwort

0

Sie könnten eine XML Datei mit den zu teilenden Konstanten haben und sie in jeder Sprache analysieren lassen.

+1

Das wird Ihnen Laufzeitwerte, nicht Kompilierzeitkonstanten geben. –

+10

XML ist wie Gewalt: Wenn es nicht funktioniert, verwenden Sie mehr. –

9

Ein Vorverarbeitungsskript, das diese Konstanten in Ihrem Code automatisch aktualisiert, ist wahrscheinlich die beste Methode. Übergeben Sie den Code mit Ihrem Projekt, um die Korrektheit sicherzustellen, und binden Sie ihn in das Buildskript ein.

+0

Dies ist, was wir bei meinem vorherigen Job gemacht haben (Mischen von C, VHDL, Assembler und Matlab). Beachten Sie, dass die Sonderfälle jedoch schnell auftauchen, wenn Sie etwas komplizierteres tun wollen als einfache Integer-Konstanten (z. B. Dinge in hex angeben können, Konstanten, die in Bezug auf andere definiert sind). –

+0

Der M4-Makroprozessor könnte eine gute Wahl sein. – caf

6

Sie können sie in einem XML-Dokument speichern und XSLT-Skripts für jede Sprache schreiben, um die entsprechenden Quelldateien in jedem Build zu generieren.

+0

Ich denke, das ist eine hervorragende Lösung - es würde auch Sonderfälle ermöglichen. Und es ist erweiterbar. – JBRWilkinson

1

Können Sie Ihr Makefile (oder Äquivalent) verwenden, um diese Konstanten zu definieren? Für C und C++. Sie können die CLI-Optionen des Compilers verwenden, um Vorprozessorwerte für die Konstanten zu definieren. Ich habe nicht viel Build-Anpassung für Verilog gemacht, aber ich vermute, dass etwas ähnliches dort auch existieren könnte.

1

Sie können eine einfache Datei in Form von

const1 = value1 
const2 = value2 
const3 = value3 

schreiben und dann so etwas wie anwenden, für c:

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

Sein bemerkenswert, dass Sie Typen angeben müssen möglicherweise weil Nicht alle Sprachen erlauben es Ihnen, ein Makro vor dem Einfügen zu verwenden, das sich nicht um den Typ kümmert.

Alternativ können Sie in Flex/Bison einen Lexer/Parser erstellen, um die Konfigurationsdatei zu analysieren. Dies wird klarer und einfacher zu erweitern sein.

0

Für Verilog (zumindest für System Verilog) und C++ Sie alle Konstanten als Liste beschrieben haben kann (unter der Annahme, dass sie alle vom gleichen Typ sind), wie folgt aus:

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

in C++ Sie würden

const int 
#include <myconsts> 

in Verilog (zumindest im System Verilog) verwenden Sie diese

parameter int 
`include "myconsts" 
verwenden können

Ich denke, C# enthält keine Includes. Also würden Sie dort zumindest ein Pre-Processing-Skript benötigen, um Ihre Konstanten in eine Klasse aufzunehmen. Sie können möglicherweise 'cpp' dafür verwenden. Entschuldigung, ich weiß nicht viel über C#.

Eigentlich, um alle ähnlich mache ich wahrscheinlich cpp verwenden würde die Datei Ich brauche zu generieren:

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

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

#ifdef(CSHARP) 
    }; 
#endif