Forum: Mikrocontroller und Digitale Elektronik "/" im C-Quellcode


von Anfänger (Gast)


Lesenswert?

Hallo,
kann mir jemand sagen, was diese Codezeilen funktionieren?
Ich habe das mit dem "/" im Quellcode noch nie gesehen.
Verwendet wird ein ATXMega324AU.

Das hier oben als "define"...

1
#define USART USARTE0
2
3
#define USART_Baudrate_Set(_usart, _bselValue, _bScaleFactor)  \
4
(_usart)->BAUDCTRLA(uint8_t)_bselValue;              \
5
(_usart)->BAUDCTRLB =(_bScaleFactor << USART_BSCALE0_bp)|(_bselValue >> 8)

Und dann der Aufruf im Programm...
1
USART_Baudrate_Set(&USART, 11 , -7);


Grüße

von Mac (Gast)


Lesenswert?

Nomalerweise endet eine Makrodefinition mit dem Ende der Zeile. Ein
1
\
 am Ende der Zeile setzt die Makrodefiniton aber auf der nächsten Zeile 
fort.

von Cyblord -. (cyblord)


Lesenswert?

> Ich habe das mit dem "/" im Quellcode noch nie gesehen.

In deinem Quellcode kommt gar kein / vor.


Schlag erst mal den Unterschied zwischen einen Slash (/) und einem 
Backslash (\) nach.

Erst danach kannst du dich dann auf weiterführende Fragestellungen 
konzentrieren.

: Bearbeitet durch User
von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

Backslash ist ein Zeilenverbinder.

von Anfänger (Gast)


Lesenswert?

Danke Mac. Das wusste ich nicht. Habs grad probiert :).
Und sorry sollte natürlich "\" in meiner Fragestellung heißen.

von Anfänger (Gast)


Lesenswert?

Danke Wolfgang.

von Theor (Gast)


Lesenswert?

Das Ding '\' heisst übrigens Backslash.
Das im Deinem Titel gezeigte '/' ist ein Slash.
In Deinem Quellcode ist ein Backslash '\'.

Man darf das nicht verwechseln in C. Das eine '\' ist, wie oben schon 
gesagt, ein Zeichen, dass die Makroxexpansion auf der folgenden Zeile 
fortgesetzt wird. Das andere '/' ist der Divisions-Operator.

von Cyblord -. (cyblord)


Lesenswert?

Theor schrieb:
> Das andere '/' ist der Divisions-Operator.

Oder ein halber Kommentar...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mac schrieb:
> in \ am Ende der Zeile setzt die Makrodefiniton aber auf der nächsten
> Zeile fort.

Das gilt übrigens nicht nur für Makrodefinitionen, sondern allgemein für 
C-Quellcode:
1
#include <stdio.h>
2
3
int main ()
4
{
5
    printf ("%s\n", "Das ist ein \
6
langer String");
7
    return 0;
8
}

Ohne Backslash gibt es einen Syntax-Error, mit Backslash kompiliert das 
Programm.

Außerdem sollte man beachten, dass dies nur für Backslashes *am Ende der 
Zeile* gilt. Ist da nur ein (unsichtbares) Leerzeichen dahinter, 
verliert der Backslash diese "Zeilenverbinderfunktion" und man wundert 
sich über merkwürdige Fehlermeldungen.

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Frank M. schrieb:
> printf ("%s\n", "Das ist ein \
> langer String");

Das sollte man lieber nicht machen, da man den Quellcode nicht mehr 
einrücken kann. Besser ist:
1
  printf ("%s\n", "Das ist ein "
2
  "langer String");

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Das sollte man lieber nicht machen, da man den Quellcode nicht mehr
> einrücken kann.

Ich wollte nur darstellen, was mit dem Backslash technisch möglich ist 
- mehr nicht.

Zum Beispiel geht auch das hier:
1
int main ()
2
{
3
    pri\
4
ntf ("%s\n", "Das ist ein langer String");
5
    ret\
6
urn 0;
7
}

Ob das sinnvoll ist, ist eine ganz andere Frage.

Der Hintergrund ist historisch zu sehen: In den 70er Jahren hatte man 
Terminals mit 24x80 Zeichen. Da waren überlange Zeilen schlecht möglich.

Und soviel ich weiß, gab es da noch nicht die Möglichkeit, einen langen 
String durch Hintereinanderschreiben von zwei Strings zu formulieren. 
Das war meiner Erinnerung nach in den 80ern zunächst eine 
gcc-Erweiterung, die dann irgendwann in den Standard übernommen wurde.

: Bearbeitet durch Moderator
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.