Почему G_DEFINE_INTERFACE вызывает ошибку компилятора ожидаемых спецификаторов объявлений?

В рамках знакомства с GObject я пытаюсь создать интерфейс «Hello, world» после пример из справочного руководства. Вот что у меня есть в hello_world_if.h:

#ifndef __HELLO_WORLD_IF_H__
#define __HELLO_WORLD_IF_H__

#include <glib-object.h>

G_BEGIN_DECLS

#define TYPE_HELLO_WORLD_IF                (hello_world_if_get_type())
#define HELLO_WORLD_IF(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_HELLO_WORLD_IF, HelloWorldIf))
#define IS_HELLO_WORLD_IF(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_HELLO_WORLD_IF))
#define HELLO_WORLD_IF_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), TYPE_HELLO_WORLD_IF, HelloWorldIfInterface))

typedef struct _HelloWorldIf HelloWorldIf; /* dummy object */
typedef struct _HelloWorldIfInterface HelloWorldIfInterface;

struct _HelloWorldIfInterface {
  GTypeInterface parent;

  gchar *(*get_hello)(HelloWorldIf *self);
};

GType hello_world_if_get_type(void);

gchar *hello_world_if_get_hello(HelloWorldIf *self);

G_END_DECLS

#endif /* __HELLO_WORLD_IF_H__ */

и в hello_world_if.c:

#include "hello_world_if.h"

G_DEFINE_INTERFACE(HelloWorldIf, hello_world_if, 0);

static void
hello_world_if_default_init(gpointer g_class) {
  /* Add properties and signals to the interface here */
}

gchar *
hello_world_if_get_hello(HelloWorldIf *self) {
  g_return_if_fail(IS_HELLO_WORLD_IF(self));

  HELLO_WORLD_IF_GET_INTERFACE(self)->get_hello(self);
}

Но это не компилируется:

$ make
gcc -g -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -c -o hello_world_if.o hello_world_if.c
hello_world_if.c:3: error: expected declaration specifiers or ‘...’ before ‘hello_world_if’
hello_world_if.c:3: error: expected declaration specifiers or ‘...’ before numeric constant
hello_world_if.c:3: warning: data definition has no type or storage class
make: *** [hello_world_if.o] Error 1

Из прочтения других ответов здесь кажется, что это сообщение «ожидаемые спецификаторы объявления» часто означает необходимый заголовочный файл не был включен или был включен слишком поздно. Но я не уверен, как это может быть здесь. (В частности, добавление #include <glib.h> или #include <glib-object.h> в файл C ничего не меняет.)

Я должен упустить что-то простое, но я просто не вижу этого. Помощь?


person Community    schedule 05.01.2013    source источник


Ответы (1)


Оказывается, есть простое объяснение: макрос G_DEFINE_INTERFACE был добавлен в GLib 2.24.0, но я использую версию 2.22.5 (стандарт для CentOS 6.3). Мне нужно либо собрать и установить более новую версию GLib, либо найти старую справочную документациюна веб-сайте. не восходит дальше 2.26.1.

person Community    schedule 05.01.2013
comment
Пакет glib2-devel устанавливает соответствующую документацию в file:///usr/share/gtk-doc/html/gobject/index.html. - person ; 06.01.2013