Forum: Mikrocontroller und Digitale Elektronik Wie ist dieses "define" zu verstehen?


von Jonas (Gast)


Lesenswert?

Hallöchen, beim stöbern durch verschiedene Sourcecodes bin ich auf 
folgende #define gestoßen:

#define XY 6
#define IRGENDWAS(N) ((N&0x3F)<<XY)

Könnte mir bitte jemand erklären, wie dies zu interpretieren ist bzw. 
was der Preprozessor (GCC) daraus machen würde?

von Peter II (Gast)


Lesenswert?

Jonas wrote:
> was der Preprozessor (GCC) daraus machen würde?

http://www2.informatik.uni-halle.de/lehre/c/c_define.html

von Simon (Gast)


Lesenswert?

Er "verundet" N mit 0x3F (also 63) und schiebt dann das Resulat um 6 
nach links

von achim.s (Gast)


Lesenswert?

XY wird fortan durch 6 ersetzt
N in IRGENDWAS wird durch das ersetzt, was beim Ersatz von IRGENDWAS in 
Klammern steht. Beispiel:

IRGENDWAS(a) wird ersetzt durch ((a&0x3F)<<6)

von Betterknower (Gast)


Lesenswert?

Jonas wrote:
> Hallöchen, beim stöbern durch verschiedene Sourcecodes bin ich auf
> folgende #define gestoßen:
>
> #define XY 6

Hier wird XY = 6 definiert.

Im Code lässt sich dann schreiben
1
int a = 3 + XY // = 9

> #define IRGENDWAS(N) ((N&0x3F)<<XY)

Hier wird eine Inline-Funktion definiert:
1
int a = IRGENDWAS(1) // Ergibt 000001 & 111111 = 000001 << XY(=6) = 1000000

von achim.s (Gast)


Lesenswert?

Problematisch ist, dass N im #define nicht geklammer ist. Interpretier 
mal

IRGENDWAS(3+7)

von mse2 (Gast)


Lesenswert?

Man kann übrigens die Toolchain dazzu veranlassen, nur den Präprozessor 
aufzurufen und sich dessen Ausgabe ansehen.
Beim gcc ist es glaub ich die Option -E.

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.