Predefined Symbol Value

Gast #5824999
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 #5825006
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. :)
Gast #5825032
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.