相同类型如何不匹配

时间:2014-01-15 15:45:30

标签: c gtk cairo

我正在尝试在我的GTK 2.0应用程序中实现问题How to create a cairo_t on a Gtk 2 window的建议,我对结果感到困惑。错误输出是

planes_view.c: In function ‘draw_lines_planes’:
planes_view.c:145:33: warning: passing argument 1 of ‘gdk_cairo_create’ from incompatible pointer type [enabled by default]
   cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));
                             ^
In file included from /usr/include/gtk-2.0/gdk/gdk.h:33:0,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from planes_view.h:35,
                 from planes_view.c:34:
/usr/include/gtk-2.0/gdk/gdkcairo.h:33:10: note: expected ‘struct GdkDrawable *’ but argument is of type ‘struct GdkDrawable *’
 cairo_t *gdk_cairo_create            (GdkDrawable        *drawable);
         ^

请注意,两种冲突类型是相同的。怎么会这样?也许有两个同名的类型?即便如此,我也需要知道如何做到这一点。

违规行最初是

cr = gdk_cairo_create(view->drawing_area);

并且投诉是绘图区域的声明类型是GtkWidget *,所以我尝试了正常的类型转换:

cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));

结果如上所示。

2 个答案:

答案 0 :(得分:1)

信任编译器。 struct GdkDrawable *GdkDrawable *不同。 GdkDrawable已经是结构的typedef:

typedef struct _GdkDrawable GdkDrawable;

正如jku所说,你搞砸了。 gdk_cairo_create需要一个GdkDrawable,而您正尝试将其提供给GtkWidget。您的GdkDrawable GdkWindow是存储在GtkWidgetwindow成员)中的gtk_widget_get_window,您可以使用{{1}}进行访问。

答案 1 :(得分:0)

我会说你有符号的不兼容定义,或者你以某种方式编译这个符号几次。检查符号的可见性。