Forum: Mikrocontroller und Digitale Elektronik ANSI-C: Verstehe eine define-Anweisung nicht


von Huizlipochtli (Gast)


Lesenswert?

Hallo,

leider steig ich gerade bei define-Anweisungen aus.

Kann mir jemand sagen was folgendes bedeuten soll ?

 #define Zustand2 2U
 #define Zustand1 1U
 #define Zustand0 0U

Im weiteren Programmverlauf werden diese defines einer unsigned 
charakter Variablen übergeben.

Sowas hab ich noch nie gesehen.

Danke für eure Hilfe

von auch mal was gewusst (Gast)


Lesenswert?

2U steht für die Zahl (Wert) 2 als unsigned.

2U == (unsigned int) 2

von EGS_TI (Gast)


Lesenswert?


von Herminator (Gast)


Lesenswert?

Hi

Das Define Zustand0 wird mit dem Wert 0 ersetzt. usw.

Ich vermute du verstehst das U nicht.
Es giebt an, das die Zahl keine negativen Wert benützt (unsigned).
Dies ist für den Compiler wichtig.

Google doch suffix

Gruss

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Huizlipochtli schrieb:
> Hallo,

> Kann mir jemand sagen was folgendes bedeuten soll ?
>  #define Zustand2 2U


guckstu bei define und C-Präprozessor:

http://de.wikipedia.org/wiki/C-Pr%C3%A4prozessor


defines sind lediglich Text-Ersetzungen der Form

#define <Ersetzungstext> <Ursprungstext>

#define PI 3.14159

#define STZM "ein supertolle, oberaffengeile rattenscharfe Zuckermaus"

Du kannst also in deinem C-Programm anstelle "Zustand2" überall den 
Kurz-Text "2U" verwenden. oder anstelle der Tipperei von 3.14... 
schreibst du PI. Oder in deinem Tagebuch, schreibst du STZM, und 
schickst den Text durch den Präprozessor. ;-)

Der Präprozessor macht dann daraus beim Übersetzen den Langtext

von Huizlipochtli (Gast)


Lesenswert?

Recht herzlichen Dank für eure schnellen und ausführlichen Antworten. 
Damit ist die Frage geklärt.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Du kannst also in deinem C-Programm anstelle "Zustand2" überall den
> Kurz-Text "2U" verwenden.

autsch, antürlich genau andersrum. Du schreibst als "symbolischen Namen" 
"Zustand2" im Quelltext, und der "technische Wert" 2U (numerische Wert 2 
unsigned") wird dann nacher beim Präprozessieren eingesetzt, z.B. um 
eine Variable mit diesen Zahlenwert vorzubesetzen.

von Huizlipochtli (Gast)


Lesenswert?

Ups, jetzt war ich wohl doch zu schnell.

Was hätte es denn kaputt gemacht wenn ich das U weglasse, denn 2 ist ja 
immer noch nicht -2 und unsigned kann ja keine negativen Zahlen.

die Frage ist also, warum das 2 überhaupt notwendig ist.

Hat das den Grund, daß die 2 hinter der define erst mal nur ein Text 
ist, und ich mit dem U gleich mit vereinbare wie er es behandeln soll ?

Aber Theoretisch könnte ich es doch weglassen. Würde das nicht über 
implizite Typumwandlung sowieso so wie oben beschreiben erfolgen ?

von Huizlipochtli (Gast)


Lesenswert?

...Korrektur...wurm das U überhaupt nötig ist.

von auch mal was gewusst (Gast)


Lesenswert?

Huizlipochtli schrieb:
> wurm das U überhaupt nötig ist.

Eine Konstante (Bsp. 2) ist signed (int).

von Huizlipochtli (Gast)


Lesenswert?

auch mal was gewußt :)

...gefällt mir :)


...und auch wenn also die signed-Konstante nur positiv wäre, wie z.B. 
die Zahl 2 würde das zu einem Fehler bei der Zuweisung zu einer unsigned 
Variable führen ?

von auch mal was gewusst (Gast)


Lesenswert?

Nein, da gibt es impliziete cast:
http://de.wikipedia.org/wiki/Typumwandlung
Aber die Wertebereiche decken sich nicht. Man muss wissen, was man tut.

von Huizlipochtli (Gast)


Lesenswert?

Hallo,

genau das habe ich ja ein paar Posts vorher schon mal angeführt. 
Theoretisch würde doch ohne das U eine implizite Typumwandlung erfolgen. 
Und weil ich 2 (positiv) angeben würde und nicht -2 (negativ) ist die 
Angabe von U doch eigentlich nicht zwingend nötig.

Sehe ich das richtig ?

von Rolf M. (rmagnus)


Lesenswert?

auch mal was gewusst schrieb:
> Nein, da gibt es impliziete cast:

Casts sind per Definition immer explizit. Ein Cast ist das, was du 
hinschreibst, wenn du explizit eine Konvertierung hervorrufen willst.
Es gibt aber implizite Konvertierungen.

Huizlipochtli schrieb:
> Theoretisch würde doch ohne das U eine implizite Typumwandlung erfolgen.

Ja.

> Und weil ich 2 (positiv) angeben würde und nicht -2 (negativ) ist die
> Angabe von U doch eigentlich nicht zwingend nötig.

An dieser Stelle wäre sie das nicht unbedingt. Man kann aber bei einigen 
Compilern Warnungen einschalten oder ein lint-Tool benutzen, wo das auch 
eine Warnung hervorruft.
Es schadet ja nicht, im #define den Typ gleich richtig zu machen, statt 
auszunutzen, daß implizite Typwandlungen das ja eh korrigieren.

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.