2009-08-11 63 views
1

你可以看到我嘗試下面的事情:如何在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; 
} 

正如你可以看到上面的Ç投工作,但宏觀版沒有,我究竟做錯了什麼?

+0

如果你展開你的宏,看起來你並沒有試圖設置任何字段,即沒有引用.xmin,.ymin甚至是.dummy,左值只是擴展爲指向my_image的指針。 – JustJeff 2009-08-11 23:02:23

+1

如果您有這樣的可能性,將來可能會通過預處理器(cpp)顯式運行它 - 它會在宏展開後向您顯示文本,因此任何錯誤都將更加明顯。對於你的例子,它顯示宏展開爲「((image_bounds *)(&my_image)); - > xmin = 20;」這有助於發現錯誤。 – 2009-08-11 23:16:32

回答

15

您需要從IMAGE_BOUNDS的定義失去了分號:

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

哈哈哈謝謝! :) – horseyguy 2009-08-11 22:58:54

+0

如果您還沒有開發分號的盲點,您不能稱自己爲C程序員! – 2009-09-02 03:30:57

2

在版本沒有宏你=之前有->xmin,在一個與宏你不知道。

+0

是啊對不起,這只是一個錯字:( – horseyguy 2009-08-11 23:01:15