Forum: Compiler & IDEs Predefined Symbol Value


von Gunther (Gast)


Lesenswert?

Hallo zusammen,

ich habe mal gelernt, Präprozessor Symbole, die mit #ifdef abgefragt 
werden, in den Projekteinstellungen einzutragen anstatt in einem Header.
Nun wollte ich die Software modular aufbauen und falls sich ein Baustein 
ändern sollte, brauche ich nur das Symbol ändern und es wird ein anderes 
Modul kompiliert.
Ich scheine aber in den Predefined Symbols keinen Wert eintragen zu 
können. Übersehe ich hier etwas?
Löst man das ganz anders und falls ja, wie am besten?

Aussehen soll das Ganze dann folgendermaßen:
1
#if VAR = foo
2
3
// kompiliere dieses Modul
4
5
#elif VAR = bar
6
7
//kompiliere das andere Modul
8
9
.
10
.
11
.
12
13
#else
14
15
#error
16
17
#endif


Viele Grüße

von Ingo Less (Gast)


Lesenswert?

Gunther schrieb:
> #if VAR = foo
Muss es nicht
1
#if VAR == foo
sein?

von Gunther (Gast)


Lesenswert?

Da hast DU recht und ich habe wohl nicht aufgepasst.

Es muss natürlich "==" heißen.


Nichts destotrotz kann ich nur auf Gleichheit prüfen, wenn ich dem 
Symbol einen Wert zuweisen kann. :)

von Walter T. (nicolas)


Lesenswert?

Gunther schrieb:
> Übersehe ich hier etwas?

Ja. Die Predefined Symbols werden in Deiner Build-Umgebung eingetragen. 
Und ohne diese zu beschreiben oder wenigstens zu nennen, kann Dir 
niemand helfen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Gunther schrieb:
> Ich scheine aber in den Predefined Symbols keinen Wert eintragen zu
> können.

Nicht? Was passiert denn, wenn du dort bspw. VAR=foo einträgst?

von A. S. (Gast)


Lesenswert?

Im Quelltext geht auch #elif defined(bar)

In den Projekteinstellungen wird es auch möglich sein, was zuzuweisen. 
Meist mit einfachem =

Mach das aber nicht, oder nur maximal mit einem Symbol, mit dem du dein 
Ziel auswählst.

Packe den Rest der nötigen Konfigurationen in verschiedene Header und 
binde die dann ein.

Wenn es alles in Headern ist, können es alle parallelen Plattformen 
auswerten (verschiedene Compiler, lint, die IDE, Metrik Tools, ...

von Gunther (Gast)


Lesenswert?

Walter T. schrieb:
> Und ohne diese zu beschreiben oder wenigstens zu nennen, kann Dir
> niemand helfen.

Oh, Ok. Ich dachte, dass wäre von der Entwicklungsumgebung unabhängig.
Es handelt sich um CCS von TI in der Version 9.0.1.

Yalu X. schrieb:
> Nicht? Was passiert denn, wenn du dort bspw. VAR=foo einträgst?

Genau das, was ich eigentlich wollte. Ich hatte wohl zwischen dem 
Gleichheitszeichen ein Leerzeichen. Dann kam immer der Fehler "Fatal 
Error #1965: cannot open source file "=". Ich hatte es dann auch ohne 
"=" probiert, wie man es in einem Header definieren würde und dann kam 
dieselbe Fehlermeldung mit dem zugewiesenem Wert anstatt "=".

Aber gut, man darf halt kein Leerzeichen dazischen haben; das war die 
Lösung.

A. S. schrieb:
> Mach das aber nicht, oder nur maximal mit einem Symbol, mit dem du dein
> Ziel auswählst.

Das Projekt ist ansich doch eh CCS abhängig oder?
Ich dachte halt, dass mann dann alle Symbole übersichtlich an einem Ort 
hätte und sich die Konfiguration der Hardware darüber abbilden ließe.
Wie gesagt, hatte es mal so gelernt, dass die Symbole lieber hier 
gesammelt werden sollten.

Lieber doch in die jeweiligen Header?


Vielen Dank schonmal für eure Hilfe!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Gunther schrieb:
> Yalu X. schrieb:
>> Nicht? Was passiert denn, wenn du dort bspw. VAR=foo einträgst?
>
> Genau das, was ich eigentlich wollte. Ich hatte wohl zwischen dem
> Gleichheitszeichen ein Leerzeichen. Dann kam immer der Fehler "Fatal
> Error #1965: cannot open source file "=".

Die in der IDE eingetragene Definition wird vermutlich direkt in eine
Kommandozeilenoption (-D, --define oder /D, je nach Compiler) des
Compileraufrufs übernommen. Ohne Leerzeichen steht da so etwas wie

1
cc -D VAR=foo main.c

D.h. VAR wird als foo definiert und damit main.c übersetzt.

Mit Leerzeichen steh da

1
cc -D VAR = foo main.c

D.h. das Argument für -D ist jetzt nur noch VAR, das nun als als nichts
oder (bspw. beim GCC) als 1 definiert wird. Das nächste Token (=) wird
nicht mehr als zu -D zugehörig betrachtet und deswegen als Name einer
Quellcodedatei interpretiert. Wenn keine Datei dieses Namens existiert,
erhältst du eine entsprechende Fehlermeldung.

von DPA (Gast)


Lesenswert?

Das "#if VAR == foo", macht vermutlich nicht, was du denkst:
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -
2
1
3
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA -
4
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=B -
5
1
6
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=C -
7
1
8
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=0 -
9
1
10
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=1 -
11
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=2 -DB=2  -
12
1
13
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=2 -DB=3  -
14
#

Undefinierte Variablen sind für den Vergleich gleich 0. Nur so als 
kleiner Hinweis...

von Zweig (Gast)


Lesenswert?

DPA schrieb:
> Undefinierte Variablen sind für den Vergleich gleich 0. Nur so als
> kleiner Hinweis...

bei GCC kann
-Wundef

helfen solche Dinge zu finden.


wenn foo und bar nicht #define'd sind. dann werden bei zu 0 expandiert
das bedeutet dass

#if VAR == foo
#warning "foo"
#endif

#if VAR == bar
#warning "bar"
#endif

BEIDE Warnungen ausgegben werden

von Zweig (Gast)


Lesenswert?

DPA schrieb:
> Undefinierte Variablen sind für den Vergleich gleich 0. Nur so als
> kleiner Hinweis...

bei GCC kann
-Wundef

helfen solche Dinge zu finden.


wenn foo und bar nicht #define'd sind. dann werden beide zu 0 expandiert
das bedeutet dass

#if VAR == foo
#warning "foo"
#endif

#if VAR == bar
#warning "bar"
#endif

BEIDE Warnungen ausgegben werden

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.