Forum: Compiler & IDEs Präprozessordefines aus externer Datei


von A. Z. (donvido)


Lesenswert?

Hallo miteinander,

ich suche jetzt schon eine Weile und finde aber nichts passendes.
Gibt es eine Möglichkeit (in Visual Studio) in C/C++ Präprozessor 
Definitionen aus einer externen Datei zu importieren?
Und zwar habe ich ein Simulinkmodell aus welchem Code generiert wird, 
der gewrapped und in eine DLL eingebunden wird. Dabei erzeugt Simulink 
eine defines.txt Datei, deren Inhalt wie folgt aussehen kann:
1
MODEL=Test
2
NUMST=4
3
NCSTATES=0
4
HAVESTDIO
5
RT
6
USE_RTMODEL
7
CLASSIC_INTERFACE=0
8
ALLOCATIONFCN=0
9
TID01EQ=0
10
MAT_FILE=0
11
ONESTEPFCN=1
12
TERMFCN=1
13
MULTI_INSTANCE_CODE=0
14
INTEGER_CODE=0
15
MT=1

Aktuell werden diese Definitionen von Hand in die Projekt Eigenschaften 
in Visual Studio kopiert. Das würde ich gerne automatisieren, da sich 
diese Definitionen auch gerne mal ändern, wenn das Simulink Modell 
angefasst wird. Am allerliebsten würde ich einfach irgendwo den Pfad zu 
der Datei angeben.
Wie würdet ihr das lösen?

von Walter T. (nicolas)


Lesenswert?

A. Z. schrieb:
> Wie würdet ihr das lösen?

.h-Datei erzeugen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

A. Z. schrieb:
> Gibt es eine Möglichkeit (in Visual Studio) in C/C++ Präprozessor
> Definitionen aus einer externen Datei zu importieren?

Ja, natürlich, das ist das Grundprinzip jedes C-Compilers.

Nur muss diese "externe Datei" den üblichen Gepflogenheiten entsprechen, 
d.h. normale C-Syntax verwenden.

Aus Deinem
1
MODEL=Test
2
NUMST=4
3
NCSTATES=0
4
HAVESTDIO
5
RT
6
USE_RTMODEL
7
(etc.)

wird dann
1
#define MODEL Test
2
#define NUMST 4
3
#define NCSTATES 0
4
#define HAVESTDIO
5
#define RT
6
#define USE_RTMODEL
7
(etc.)

Also jedes "=" durch ein Leerzeichen ersetzen und an den Anfang jeder 
Zeile ein "#define " einfügen.

Diese Transformation aus dem einen ins andere Format müsstest Du mit 
einem simplen Skript basteln, und das Ergebnis in Deinem Projekt via 
#include einbinden.

VisualStudio kennt auch das Konzept der "forced includes", die ohne eine 
eigene #include-Anweisung in jede zum Projekt gehörende 
Übersetzungseinheit eingebunden werden.

(Configuration Properties -> C/C++ -> Advanced -> Forced Include File)

: Bearbeitet durch User
von A. Z. (donvido)


Lesenswert?

Ok danke für die Hilfe,
Habe dann doch ein kleines Skript geschrieben um den Inhalt von 
Defines.txt anzupassen.

von Onkel Sam (Gast)


Lesenswert?

A. Z. schrieb:
> Habe dann doch ein kleines Skript geschrieben um den Inhalt von
> Defines.txt anzupassen.

Magst Du Dein Script mal hier posten?

von DPA (Gast)


Lesenswert?

Onkel Sam schrieb:
> A. Z. schrieb:
>> Habe dann doch ein kleines Skript geschrieben um den Inhalt von
>> Defines.txt anzupassen.
>
> Magst Du Dein Script mal hier posten?

Sowas ist doch  ein Einzeiler...
1
sed -n 's/^\([a-Z0-9_]\+\)\(=\(.*\)\)\?\s*$/#define \1 \3/p' <inputfile >outputfile.h

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. Z. schrieb:
> Wie würdet ihr das lösen?

Beim GCC gibt's auch die Möglichkeit von Option-Files:

Eine Textdatei mit gewünschtem Namen anlegen, z.B. opt.txt, und beim 
Compilieren @opt.txt als Option mit angeben.  In der Option-Datei können 
beliebige Optionen stehen (und auch Dateinamen etc.), eine pro Zeile. 
Also würde opt.ttx in deinem Fall so aussehen:
1
-D MODEL=Test
2
-D NUMST=4
3
-D NCSTATES=0
4
-D HAVESTDIO
5
-D RT
6
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.