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
0 ist der Wert dieser "Konstanten"... und der wird lediglich nach "unsigned portBASE_TYPE" umgewandelt (ge-casted)
Die Null (0) wird auf den Datentyp unsigned portBASE_TYPE gecastet
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...
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
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
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.
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.