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?
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
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. –