Компиляция const GdkPixdata: «ошибка: элемент инициализатора не является константой» - PullRequest
0 голосов
/ 04 марта 2012

У меня проблема, которую я не могу понять.
Я хочу "включить" прямо в мой код на C серию иконок. Используя инструмент gdk-pixbuf-csource (с параметром --struct), я создал файл, который инициализирует структуру постоянных пикселей для каждого изображения. И пример закодированного изображения:

const GdkPixdata pixdata_flipH = {
   0x47646b50, /* Pixbuf magic: 'GdkP' */
   24 + 479, /* header length + pixel_data length */
   0x2010002, /* pixdata_type */
   64, /* rowstride */
   16, /* width */
   16, /* height */
   /* pixel_data: */
   "\257\0\0\0\0\1\0\0\0\1\203\0\0\0\0\2\0\0\0\2\40J\207E\202\40J\207\377"
   "\202\0\0\0\0\202\40J\207\377\2\40J\207E\40J\207\2\202\0\0\0\0\1\0\0\0"
   "\2\203\0\0\0\0\4\40J\2072\40J\207\377\276\322\352\377\40J\207\377\202"
   <data continues......>
   "\0\0\0\0\1\40J\207\1\204\0\0\0\0\1\40J\207\3\227\0\0\0\0\1\0\0\0\3\244"
};

Я хочу включить значки в некоторые кнопки, поэтому я подготовил следующую серию утверждений:

GtkWidget *icon_flipH = gtk_image_new_from_pixbuf(gdk_pixbuf_from_pixdata(&pixdata_flipH, FALSE, NULL));
GtkWidget *icon_flipV = gtk_image_new_from_pixbuf(gdk_pixbuf_from_pixdata(&pixdata_flipV, FALSE, NULL)); 
// and so on...

Таким образом я добавлю изображение к кнопке с функцией:

gtk_button_set_image(GTK_BUTTON(button_flipH), icon_flipH);

Хорошо ... Компилятор GCC ошибается, говоря, что «элемент инициализатора не является константой» в каждой строке, содержащей функцию gdk_pixbuf_from_pixdata (). Я не могу понять почему, потому что функция нуждается в указателе структуры const, и фактически мои структуры объявлены как const.

Я что-то забыл? Разве это не правильный способ включать изображения в код и создавать pixbufs? Любой учебник в этом случае?

1 Ответ

2 голосов
/ 04 марта 2012

Объекты, определенные в области видимости файла (например, icon_flipH), имеют статическую продолжительность хранения: их время жизни - это время жизни программы, и они инициализируются перед запуском программы. Вы можете только инициализировать объекты со статической продолжительностью хранения с постоянным выражением (например, 0, 10 + 32 или sizeof (int)). Результат вызова функции не является константным выражением.

// File scope

GtkWidget *icon_flipH = NULL;   // OK, NULL is a constant expression  
GtkWidget *icon_flipV = foo();  // Not OK, foo is not a constant expression
...