【问题标题】:How can identical types fail to match相同类型如何无法匹配
【发布时间】:2014-01-15 15:45:30
【问题描述】:

我正在尝试在我的 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));

结果如上所示。

【问题讨论】:

  • 你能把它缩减为一个最小的可编译示例吗? (我的直觉告诉我,你对结构的定义不兼容,但我认为这不是你会看到的错误。)
  • 尝试删除关键字“struct”。我猜 GdkDrawable 已经是 typedef 了。
  • 你不能只是把东西转换成它们不是的东西(GtkWidget 不是 GdkDrawable)。您想要的 GdkDrawable 可能是 view->drawing_area->window,但为什么不按照我在原始答案中所做的操作:widget->window(假设暴露处理程序的第一个参数称为小部件)? ...实际上现在我想起来了:gtk_widget_get_window (widget) 将是最好的方法。

标签: c gtk cairo


【解决方案1】:

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

typedef struct _GdkDrawable GdkDrawable;

正如 jku 所说,你把事情搞砸了。 gdk_cairo_create 需要 GdkDrawable,而您正试图为其提供 GtkWidget。您的GdkDrawable 是存储在GtkWidgetwindow 成员)中的GdkWindow,您可以使用gtk_widget_get_window 访问它。

【讨论】:

    【解决方案2】:

    我会说您对该符号的定义不兼容,或者您​​以某种方式多次编译该符号。检查符号的可见性。

    【讨论】:

    • 这根本没有帮助。该结构来自 GTK/cairo 标头。我的代码没有定义它。
    • 此外,除此之外,我不知道如何检查“可见性”,或者确实是 C 中的内容。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多