Я в процессе переноса некоторого кода из База исходного кода GIMP в программу, которую я пишу. Часть кода (/gimp-2.8.10//modules/display-filter-color-blind.c) ссылается на макрос под названием GIMP_CAIRO_ARGB32_SET_PIXEL (gimp-2.8.10 // libgimpcolor / gimpcairocolor.h). В этом макросе есть нечто, называемое G_STMT_START / G_STMT_END. Мой компилятор (Mac OSX через XCode с компилятором по умолчанию) жалуется на ошибку «Использование необъявленного идентификатора ‘G_STMT_START'». Я знаю, что это не проблема с областью, где я помещаю макросы (в заголовочный файл с именем globals.h, который Я включаю в мой .h), потому что компилятор не жалуется на определение GIMP_CAIRO_ARGB32_SET_PIXEL.
Кто-нибудь знает, что здесь происходит? Я попытался просмотреть все экземпляры G_STMT_START в источнике GIMP, но не нашел ничего, что могло бы определить G_STMT_START / G_STMT_END. Я также нашел своего рода объяснение в документации к инструментарию GIMP, но это далеко не полезно (по крайней мере для меня).
Это полный макрос, который я пытаюсь использовать:
/**
* GIMP_CAIRO_ARGB32_SET_PIXEL:
* @d: pointer to the destination buffer
* @r: red component, not pre-multiplied
* @g: green component, not pre-multiplied
* @b: blue component, not pre-multiplied
* @a: alpha component
*
* Sets a single pixel in an Cairo image surface in %CAIRO_FORMAT_ARGB32.
*
* Since: GIMP 2.6
**/
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define GIMP_CAIRO_ARGB32_SET_PIXEL(d, r, g, b, a) \
G_STMT_START { \
const guint tr = (a) * (r) + 0x80; \
const guint tg = (a) * (g) + 0x80; \
const guint tb = (a) * (b) + 0x80; \
(d)[0] = (((tb) >> 8) + (tb)) >> 8; \
(d)[1] = (((tg) >> 8) + (tg)) >> 8; \
(d)[2] = (((tr) >> 8) + (tr)) >> 8; \
(d)[3] = (a); \
} G_STMT_END
#else
#define GIMP_CAIRO_ARGB32_SET_PIXEL(d, r, g, b, a) \
G_STMT_START { \
const guint tr = (a) * (r) + 0x80; \
const guint tg = (a) * (g) + 0x80; \
const guint tb = (a) * (b) + 0x80; \
(d)[0] = (a); \
(d)[1] = (((tr) >> 8) + (tr)) >> 8; \
(d)[2] = (((tg) >> 8) + (tg)) >> 8; \
(d)[3] = (((tb) >> 8) + (tb)) >> 8; \
} G_STMT_END
#endif
Спасибо за любую помощь с этим!
Я понятия не имел, что это может быть (хотя теперь, когда я знаю, я говорю себе, что я, вероятно, мог догадаться), но все, что нужно, чтобы узнать, входил G_STMT_START
в Google и нажав на первый результат.
Эта страница, документация из руководства Glib, показывает, что это макрос, предназначенный для использования в макросах с несколькими операторами.
G_STMT_START
#define G_STMT_START
Используется в макросах с несколькими операторами, так что их можно использовать в местах, где компилятор ожидает только одну инструкцию.
G_STMT_END
#define G_STMT_END
Используется в макросах с несколькими операторами, так что их можно использовать в местах, где компилятор ожидает только одну инструкцию.
Позже в результатах поиска вы получите одну или несколько копий gmacros.h
заголовочный файл, где эти макросы фактически определены:
/* Provide simple macro statement wrappers (adapted from Perl):
* G_STMT_START { statements; } G_STMT_END;
* can be used as a single statement, as in
* if (x) G_STMT_START { ... } G_STMT_END; else ...
*
* For gcc we will wrap the statements within `({' and `})' braces.
* For SunOS they will be wrapped within `if (1)' and `else (void) 0',
* and otherwise within `do' and `while (0)'.
*/
#if !(defined (G_STMT_START) && defined (G_STMT_END))
# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
# define G_STMT_START (void) __extension__ (
# define G_STMT_END )
# else
# if (defined (sun) || defined (__sun__))
# define G_STMT_START if (1)
# define G_STMT_END else (void)0
# else
# define G_STMT_START do
# define G_STMT_END while (0)
# endif
# endif
#endif
Из этого становится довольно ясно, что эти макросы просто реализуют стандартная идиома, за исключением GCC, где они используют расширение, предназначенное именно для этой цели.
Я бы подумал, что будут другие части кода GIMP, которые будут зависеть от заголовков Glib, поэтому вы, вероятно, захотите включить их, если используете его код. Но если нет, то здесь достаточно информации для самостоятельной реализации соответствующих частей кода.
G_STMT_START
а также G_STMT_END
макросы в библиотеке Gnome Glib, от которых зависит gimp.
Они определены в gmacros.h
,