gtk+2.0中GtkObject结构中没有klass成员的解决办法

时间:2022-10-25 17:30:38

gtk+2.0中一些较老的程序中会有如下的代码:

#define EVENT_METHOD(obj, method) GTK_WIDGET_CLASS(GTK_OBJECT(obj)->klass)->method

但是编译时会出现如下错误:

no member named 'klass' in 'struct _GtkObject'

使用编译的库是gtk+2.0,在源代码开头加上定义#define GTK_ENABLE_BROKEN也不行。

打开gtkobject.h头文件,发现其中有几个宏:

#define GTK_TYPE_OBJECT              (gtk_object_get_type ())

#define GTK_OBJECT(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_OBJECT, GtkObject))

#define GTK_OBJECT_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_OBJECT, GtkObjectClass))

#define GTK_IS_OBJECT(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_OBJECT))

#define GTK_IS_OBJECT_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_OBJECT))

#define GTK_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GTK_TYPE_OBJECT, GtkObjectClass))

看到最后一个了吗?将最开始的代码修改如下即可:

#define EVENT_METHOD(obj,method) GTK_WIDGET_CLASS(GTK_OBJECT_GET_CLASS(obj))->method

可能是较新的gtk中将结构的klass元素隐藏起来了,我们不可以直接引用klass结构元素,使用宏间接访问吧。