2009-08-11 11 views
1

können Sie sehen, was ich versuche unten zu tun:Wie mache ich diesen cleveren Casting in C?

typedef struct image_bounds { 
    int xmin, ymin, xmax, ymax; 
} image_bounds; 

#define IMAGE_BOUNDS(X) ((image_bounds *)(X)); 

typedef struct { 
    image_bounds bounds; 
    float dummy; 
} demo; 

int 
main(void) { 
    demo my_image; 

    /* this works fine */ 
    ((image_bounds *)(&my_image))->xmin = 10; 

    /* why doesn't this work? i get the following error: 
    /* In function main: 
     cast.c:20: error: expected expression before = token 
    */  
    IMAGE_BOUNDS(&my_image)->xmin = 20; 

    return 0; 
} 

Wie Sie aus über den C Guss Werke sehen können, aber die Makro-Version nicht, was ich falsch mache?

+0

Wenn Sie Ihr Makro erweitern, scheint es nicht, dass Sie versuchen, ein Feld festzulegen, d. H. Es gibt keinen Verweis auf .XMIN, .YMIN oder sogar .Dummy, der L-Wert wird nur zu einem Zeiger auf my_image erweitert. – JustJeff

+1

Ein nützlicher Trick für die Zukunft könnte sein, es explizit durch den Präprozessor (cpp) laufen zu lassen, wenn Sie eine solche Möglichkeit haben - es wird Ihnen den Text nach der Makroerweiterung zeigen, so dass alle Fehler viel sichtbarer werden. Für Ihr Beispiel wurde das Makro auf "((image_bounds *) (& my_image)) erweitert; -> xmin = 20;" was hilft, den Fehler zu erkennen. –

Antwort

15

Sie müssen das Semikolon aus der Definition von IMAGE_BOUNDS verlieren:

#define IMAGE_BOUNDS(X) ((image_bounds *)(X)) 
+0

hahahah danke! :) – horseyguy

+0

Sie können sich nicht C-Programmierer nennen, wenn Sie keinen blinden Fleck für Semikolons entwickelt haben! –

2

In der Version ohne Makros Sie ->xmin vor dem = haben, in dem man mit Makros nicht.

+0

yeah Entschuldigung das war nur ein Tippfehler :( – horseyguy