www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik #define anweisungen, "\" unbekannter operator


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

beim nachfolgendem makrodefine bin ich verunsichert:

#define makro() \
IEN=0;

das IEN=0 gehört scheinbar zum makro

auch wird "\" scheinbar als trennungszeichen für auszählungen
genutzt.

#define DEFINITION {            \,
                      {definition1}\,
                      {definition2}\,
                      {definition3}\,
                    }

kann mir da jemand auf die sprünge helfen?
ich habe sowas in C noch nie gesehen. Kann auch nirgends im Netz
finden.

Vielen Dank

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das \ lässt den nachsten zeilenvorschub (also CR/LF) ignorieren, so
wird

hallo \
test \
welt

zu hallo test welt.

das gilt nicht nur für präprozessoranweisungen. das klappt auch bei
strings

"langer text" \
"über zwei"\
"zeilen"

bei den defines macht das besonders dann sinn, wenn der text der hinter
diesen defines steckt besonders lang ist, und man nicht immmer wie wild
von links nach rechts scrollen muß

gruß
rene

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zudem muß iirc nach dem '\' DIREKT ein \n, bzw \r\n folgen, also
dürfte
Dein

#define DEFINITION {            \,

nicht funktionieren.

Grüße, Freakazoid

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei strings ergibt das allerdings keinen Sinn, denn das :
char *str1 = "Hallo"
             " "
             "Welt!";

...und das:
#define SPACE " "
char *str2 = "Hallo" SPACE "Welt!";

Funktioniert auch und nennt sich "string concatenation"...

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,

in meinem Fall ist es tatsächlich exakt, wie es Rene beschrieben hat.

Jetzt wird mir einiges klar.

Viele Grüße

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@oldbug

stimmt. ist mir gerade erst aufgefallen das hinter dem \ noch ein ,
ist.. von daher kann es dann nicht klappen (bzw. der compiler müsste
meckern).
allerdings bin ich mir nicht sicher ob es nicht doch möglich ist hinter
dem \ noch spaces zu haben.
aber ich denke das hängt vom compiler ab (z.b. meckert der IAR wenn in
der letzten zeile zeichen (spaces) außer cr/lf stehen).

gruß
rene

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig, das "," ist wohl das Problem. Leerzeichen sollten eigentlich
keine Probleme machen.

Um Mehrzeilige Makros ganz sicher zu machen sollte man folgende
Notation verwenden:

#define MAKRO do {

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, da fehlt noch was:

#define MAKRO() do {       \
                   Anweisung1();   \
                   Anweisung2();   \
                   Anweisung3();   \
                }while (0)

Dann hat man auch kein Problem bei z.B. folgender verwendung:

if (23 == abc)
   MAKRO();
else
   ...

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@christian

stümmt. so funktionierts ! :-)

nutze die präprozessor-makros ganz intensiv für meine software sachen.
damit kann man saumässig viel machen (nicht zuletzt kapuut-machen
:-)))
vor allem bei code-generierten tabellen (fett grinsend) kann man
super damit arbeiten.
ich wünschte mir jede programmiersprache hätte sowas (vor allem
assembler und delphi, da tut sowas derart not .....)

gruß
rene

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.
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.

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