Predefined Symbol Value

Gast #5824999
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
Gast #5825032
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, ...
Gast #5825055
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!
Moderator #5825449
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.
Gast #5825480
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...
Gast #5825694
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
Gast #5825695
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren