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结构元素,使用宏间接访问吧。