如何在C中进行这种聪明的投射?

时间:2009-08-11 22:55:24

标签: c casting macros c-preprocessor

你可以看到我在下面尝试做的事情:

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;
}

正如您从上面可以看到的那样 C 投射有效,但宏版本没有,我做错了什么?

2 个答案:

答案 0 :(得分:15)

您需要从IMAGE_BOUNDS的定义中删除分号:

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

答案 1 :(得分:2)

在没有宏的版本中,您在->xmin之前有=,而在没有宏的版本中则没有。{/ p>