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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.