Почему G DEFINE INTERFACE вызывает ошибку компилятора" expected declaration specifiers"?
В рамках ознакомления с 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 ничего не меняет.)
1 ответ:
Оказывается, есть простое объяснение: макрос
G_DEFINE_INTERFACE
был добавлен в GLib 2.24.0 , но я использую версию 2.22.5 (стандарт на CentOS 6.3). Мне нужно будет либо построить и установить новую версию GLib, либо откопать старую справочную документацию-веб-сайт не уходит дальше 2.26.1.