首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLib- gobject -创建gobject时的警告

GLib- gobject -创建gobject时的警告
EN

Stack Overflow用户
提问于 2013-07-04 21:17:49
回答 3查看 1.2K关注 0票数 0

我正在尝试用c (c_glib)创建一个flume-thrift客户端,但是在创建要发送到服务器的gobject时遇到了问题。我在main.c的代码行中得到以下错误:

代码语言:javascript
复制
`GLib-GObject-WARNING **: IA__g_object_new_valist: object class `ThriftFlumeEventType' has no property named `timestamp'`

flume_types.h和flume_types.c中的代码是从thrift自动生成的。如果您需要查看更多代码,请告诉我。我很感谢我能得到的所有帮助!

Flume_types.h中的部分代码:

代码语言:javascript
复制
struct _ThriftFlumeEvent
{ 
  ThriftStruct parent;

  /* public */
  gint64 timestamp;
  gboolean __isset_timestamp;
  Priority priority;
  gboolean __isset_priority;
  GByteArray * body;
  gboolean __isset_body;
  gint64 nanos;
  gboolean __isset_nanos;
  gchar * host;
  gboolean __isset_host;
  GHashTable * fields;
  gboolean __isset_fields;
};
typedef struct _ThriftFlumeEvent ThriftFlumeEvent;


GType thrift_flume_event_get_type (void);
#define TYPE_THRIFT_FLUME_EVENT (thrift_flume_event_get_type())

Flume_types.c中的部分代码:

代码语言:javascript
复制
void 
thrift_flume_event_instance_init (ThriftFlumeEvent * object)
{
  printf("thrift_flume_event_instance_init");

  /* satisfy -Wall */
  THRIFT_UNUSED_VAR (object);
  object->timestamp = 0;
  object->__isset_timestamp = FALSE;
  object->__isset_priority = FALSE;
  object->body = NULL;
  object->__isset_body = FALSE;
  object->nanos = 0;
  object->__isset_nanos = FALSE;
  object->host = NULL;
  object->__isset_host = FALSE;
  object->fields = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
  object->__isset_fields = FALSE;
}

GType
thrift_flume_event_get_type (void)
{
  static GType type = 0;

  if (type == 0)
  {
    static const GTypeInfo type_info =
    {
      sizeof (ThriftFlumeEventClass),
      NULL, /* base_init */
      NULL, /* base_finalize */
      (GClassInitFunc) thrift_flume_event_class_init,
      NULL, /* class_finalize */
      NULL, /* class_data */
      sizeof (ThriftFlumeEvent),
      0, /* n_preallocs */
      (GInstanceInitFunc) thrift_flume_event_instance_init,
      NULL, /* value_table */
    };

    type = g_type_register_static (THRIFT_TYPE_STRUCT,
                                   "ThriftFlumeEventType",
                                   &type_info, 0);
    type.timestamp;
  }

  return type;
}

Main.c中的部分代码:

代码语言:javascript
复制
  gpointer eventObj = g_object_new(TYPE_THRIFT_FLUME_EVENT,
                                     "timestamp", 0,
                                     "__isset_timestamp", 0,
                                     "priority", 0,
                                     "__isset_priority", 0,
                                     "body", 0,
                                     "__isset_body", 0,
                                     "nanos", 0,
                                     "__isset_nanos", 0,
                                     "fields", 0,
                                     "__isset_fields", 0,
                                     0);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-19 20:19:03

这就是问题的解决方案:

代码语言:javascript
复制
ThriftFlumeEvent *event = g_object_new(TYPE_THRIFT_FLUME_EVENT, 0);
event->timestamp = (gint64)t_stamp.tv_sec * 1000;
event->__isset_timestamp = TRUE;
event->priority = priority;
event->__isset_priority = TRUE;
...
票数 0
EN

Stack Overflow用户

发布于 2014-09-19 01:18:03

这在Thrift 0.9.2中发生了变化:由C (GLib)编译器生成的表示Thrift结构的对象现在将其成员公开为GObject属性,从而避免了直接修改对象的实例结构的危险(和糟糕的)实践。

从0.9.2开始,初始化struct对象的首选方法本质上是发帖人最初期望的:

代码语言:javascript
复制
ThriftFlumeEvent *event =
  g_object_new (TYPE_THRIFT_FLUME_EVENT,
                "timestamp", (gint64)t_stamp.tv_sec * 1000,
                "priority",  priority,
                ...
                NULL);

注意:__isset_字段由对象本身管理,不应直接设置。

票数 1
EN

Stack Overflow用户

发布于 2013-07-08 04:50:32

GObject属性不是C结构成员。您需要通过g_object_install_property在您的类init function https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html中安装它们。您还需要从GObject (或从GObject派生的任何结构)派生对象。

注意:C中的derived意味着它必须将父元素作为第一个成员,这样才能无缝转换(而不是指向GObject的指针!)

你应该读一本关于这个主题的书,它可能会变得相当复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17471332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档