Forum: Mikrocontroller und Digitale Elektronik was bedeutet diese C-Codezeile?


von S. F. (deffman)


Lesenswert?

Hallo zusammen,

ich verstehe den zweiten Teil dieser Codezeile nicht. könnt ihr mir 
sagen was die 0 da hinten bedeutet? Hab sowas noch nie gesehen.

#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )

Gruß und Danke Stefan

von Sven P. (Gast)


Lesenswert?

0 ist der Wert dieser "Konstanten"... und der wird lediglich nach 
"unsigned portBASE_TYPE" umgewandelt (ge-casted)

von Kanzler Gorkon (Gast)


Lesenswert?

Die Null (0) wird auf den Datentyp unsigned portBASE_TYPE gecastet

von Daniel F. (df311)


Lesenswert?

die Zeile sagt dem Präprozessor, dass er jedes Vorkommen von 
"tskIDLE_PRIORITY" durch "( ( unsigned portBASE_TYPE ) 0 )" ersetzen 
soll.
Der Teil in Klammern ist nichts anderes als ein simpler Cast, der dem 
Compiler sagt, als welchen Datentyp er die 0 interpretieren soll (char, 
int, ...).

nehmen wir mal folgenden (aus der Luft gegriffenen und ziemlich 
sinnlosen) Code an:
1
#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )
2
3
typedef uint8_t (unsigned portBASE_TYPE);
4
5
typedef struct {
6
//...
7
unsigned portBASE_TYPE val;
8
//...
9
} TYPE_STRUCT;
10
11
// [...]
12
13
TYPE_STRUCT xyz.val = tskIDLE_PRIORITY;

nach dem Durchlauf des Präprozessors sieht das ganze dann in etwa so 
aus:
1
// wie oben
2
3
TYPE_STRUCT xyz.val = ( ( unsigned portBASE_TYPE ) 0 );

Wobei man die äuseren Klammern nach dem "=" auch weglassen könnte (im 
#define).
Das ganze ist also nichts anderes als "Faulheit" des Programmieres, der 
nicht immer (...) schreiben möchte, sondern einfach tskIDLE_PRIORITY und 
dabei auch noch die Lesbarkeit des Codes deutlich erhöht.

EDIT:
Verdammt zu langsam oder zu viel geschrieben...

von Peter D. (peda)


Lesenswert?

Kanzler Gorkon wrote:
> Die Null (0) wird auf den Datentyp unsigned portBASE_TYPE gecastet

Was aber nicht erlaubt ist.

Man darf keine standard Typbezeichner auf eigene Typbezeichner anwenden!

Das geht hier wohl nur deshalb gut, weil "portBASE_TYPE" kein echter 
Typbezeichner ist sondern auch wieder nur ein Macro.

Das "unsigned" ist hier also Quatsch.


Peter

von S. F. (deffman)


Lesenswert?

Ah vielen Dank euch allen! Jetzt isses klar.

@Daniel: Warst zwar langsamer, aber hats mir nochmal sehr verdeutlicht! 
THNX!!!

Gruß und noch nen schönen Abend!

Stefan

von lkmiller (Gast)


Lesenswert?

Und warum machen wir den CAST?

Wir sagen dem Compiler damit nur, dass wir genau wissen was wir tun.
Dann präsentiert uns der Compiler keine Warnungen. Nur darum.

Z.B.
1
char c;
2
short s;
3
:
4
: 
5
c = s;
6
:
--> Compilerwarnung: in c passt weniger als in s.
                     s wird abgeschnitten.
1
char c;
2
short s;
3
:
4
: 
5
c = (char)s;
6
:
--> keine Warnung, denn wir haben dem Compiler gesagt:
    Er soll doch bitte s wie einen char behandeln.
    Wir wissen selber, dass in c weniger passt als in s.

von lkmiller (Gast)


Lesenswert?

@ Peter Danegger

Das
:
#define tskIDLE_PRIORITY  ( ( unsigned portBASE_TYPE ) 0 )
:
kommt aus so einer Define-eritis, wo aus einem char ein BYTE (alternativ 
portBASE_TYPE) und daraus ein unsigned BYTE (oder auch unsigned 
portBASE_TYPE) wird, und zum Schluss kann das keiner mehr lesen.

Ich jedenfalls krieg da immer gleich die Krätze am Auge,
wenn ich sowas sehe ;-)

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.