was bedeutet diese C-Codezeile?

#901465
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...
#901475
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
Gast #901482
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.
Gast #901491
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren