gcc:"警告:从不兼容的指针类型中分配"

时间:2015-07-10 20:24:27

标签: c gcc

我想从我正在处理的旧库的代码中删除以下警告:

Image.c:171:22: warning: assignment from incompatible pointer type [enabled by default]
   image->f.get_pixel = get_pixel1;

我缩短了以下文字中的代码,以便于阅读!

现在,我认为get_pixel1是一个指向此函数的函数指针:

#define READ_BIT(image, x, y)   \
    (image->data[(y * image->bytes_per_line) + (x >> 3) ] & (1 << (x & 7)))

static unsigned long
get_pixel1(XImage *image, unsigned int x, unsigned int y)
{
    return READ_BIT(image, x, y) != 0;
}

虽然f.get_pixel在这里定义:

typedef struct _XImage {
    int width, height;      /* size of image */
    /* snip */
    struct funcs {      /* image manipulation routines */
    struct _XImage *(*create_image)( /*snip*/ );
    /* snip */
    unsigned long (*get_pixel)  (struct _XImage *, int, int);
    /* snip */
    } f;
} XImage;

我的问题是我必须在此处播放以删除问题标题中的警告:

    image->f.get_pixel = (?????)get_pixel1;

或者除了演员之外还有什么可以做的吗?

1 个答案:

答案 0 :(得分:3)

在您拥有的结构中:

b2

您将自己的职能声明为:

unsigned long (*get_pixel)  (struct _XImage *, int, int);

不匹配是第二个和第三个参数中的static unsigned long get_pixel1(XImage *image, unsigned int x, unsigned int y) ,要么将它们添加到struct成员中,要么从函数定义中删除它们。

通常,您不应该将函数指针强制转换为另一种类型的函数指针,因为它会导致未定义的行为。所以如果你发现自己做了这样的事情:

unsigned

可能有更好的解决方案。有关详细信息,请参阅此SO question