mikrocontroller.net

Forum: Compiler & IDEs Predefined Symbol Value


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Gunther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#if VAR = foo

// kompiliere dieses Modul

#elif VAR = bar

//kompiliere das andere Modul

.
.
.

#else

#error

#endif


Viele Grüße

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gunther schrieb:
> #if VAR = foo
Muss es nicht
#if VAR == foo
sein?

Autor: Gunther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht 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, ...

Autor: Gunther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

cc -D VAR=foo main.c

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

Mit Leerzeichen steh da

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.

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "#if VAR == foo", macht vermutlich nicht, was du denkst:
# echo $'#if A==B\n1\n#endif' | gcc -E -P -
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA -
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=B -
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=C -
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=0 -
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=1 -
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=2 -DB=2  -
1
# echo $'#if A==B\n1\n#endif' | gcc -E -P -DA=2 -DB=3  -
#

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

Autor: Zweig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zweig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.