c: void typecast

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

c: void typecast

Beitrag von lisan » 18.08.2004 06:22:52

Code: Alles auswählen

  (void)(
         ( error = TT_New_Glyph( face, &glyphs[j] ) ) ||
         ( error = TT_Load_Glyph( instance, glyphs[j], code, load_flags))
       );
Was'n das ?

Ein cast nach (void*) versteh ich ja noch aber einen bool nach void ?

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 18.08.2004 12:45:58

Hehe... Dem Programmierer sollte man aber 'mal kräftig die Ohren langziehen...

Der Trick ist, dass er die Kurzschlussevaluation (a || b: wenn a schon wahr ist, wird b gar nicht mehr kontrolliert) dazu missbraucht, die zweiten Funktion von der ersten abhängig zu machen. D.h. wenn die erste Funktion (TT_New_Glyph) mit true (bzw != 0 in C) zurückkommt, wird die zweite Funktion (TT_Load_Glyph), gar nicht mehr ausgeführt.

In Perl sieht man so etwas öfter als

Code: Alles auswählen

open(FILE, "/etc/passwd") || die("cannot open /etc/passwd");
Wenn das open gelingt (true), wird das "die" nicht ausgeführt. Wenn das open fehlschlägt (false), wird das die ausgeführt und das Programm beendet sich mit einem Error.

Soviel erstmal dazu, was das Statement überhaupt bezwecken soll.

Der (void) cast dient einfach nur dazu, den Compiler ruhigzustellen. Eigentlich hätte der boolesche Ausrruck in C einen Rückgabewert vom Typ int (C kennt ja keinen bool Typ), der aber nirgendwo aufgefangen wird. Der C Compiler würde dann mindestens ein Warning auswerfen: "Warning: statement has no effect", oder evtl. sogar einen error. Daher wird der int Wert einfach nach void gecastet, und es ist Ruhe.

In Perl mag so ein Konstrukt ja OK sein, aber in C ist das echt schlechter Stil (IMHO)...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 18.08.2004 13:45:27

Ich hatte auch eine Weile über dem Statement gegrübelt. War mir aber nicht sicher, ob es wirklich das machen soll was ich dachte (das was Du auch geschrieben hast).

Ich halte sowas auch für extrem schlechten Stil, da es schwer nachzuvollziehen und zu warten ist.

Und wenn ich mich richtig erinnere, dann ist laut Standard auch nicht festgelegt, welche der beiden Anweisungen zuerst ausgeführt wird. Bin mir aber nicht sicher, da ich sowas nie schreiben würde....


Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 18.08.2004 17:18:12

Bitweises OR garantiert keine Evaluation Order, logisches OR schon. Siehe http://www.vmunix.com/~gabor/c/draft.html#106 (ISO C Standard Draft, der endgültige Standard ist nur gegen Geld zu haben, da die ISO von dem Vertrieb der Dokumente lebt...)
[#4] Unlike the bitwise | operator, the || operator
guarantees left-to-right evaluation; there is a sequence
point after the evaluation of the first operand. If the
first operand compares unequal to 0, the second operand is
not evaluated.
Auf das Verhalten kann man sich also durchaus verlassen, aber das ändert nichts am schlechten Stil, weil das Statement einfach undurchsichtig und schlecht lesbar ist...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 19.08.2004 16:34:29

Danke fuer die antworten - was der code tut ist mir klar, nur der void cast war mir unklar ;) ..
Ich denke auch, dass es in der absicht des authors lag den compiler von einem huesteln abzuhalten.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 19.08.2004 17:56:16

lisan hat geschrieben:Danke fuer die antworten - was der code tut ist mir klar, nur der void cast war mir unklar ;) ..
Ich denke auch, dass es in der absicht des authors lag den compiler von einem huesteln abzuhalten.
... aber nicht, den Leser vor einem Ekelgefühl ;)

Antworten