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


von Bernd (Gast)


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

von TheMason (Gast)


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

von André K. (freakazoid)


Lesenswert?

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

#define DEFINITION {            \,

nicht funktionieren.

Grüße, Freakazoid

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Bei strings ergibt das allerdings keinen Sinn, denn das :
1
char *str1 = "Hallo"
2
             " "
3
             "Welt!";

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

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

von Bernd (Gast)


Lesenswert?

Vielen Dank,

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

Jetzt wird mir einiges klar.

Viele Grüße

von TheMason (Gast)


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

von Christian (Gast)


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 {

von Christian (Gast)


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

von TheMason (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.