我正在将一些代码从GIMP source code base移植到我正在编写的程序中。代码(/gimp-2.8.10//modules/display-filter-color-blind.c)的一部分引用了一个称为GIMP_CAIRO_ARGB32_SET_PIXEL(瘸子-2.8.10 // libgimpcolor / gimpcairocolor.h)宏。在该宏中,有一个名为G_STMT_START / G_STMT_END的东西。我的编译器(Mac OSX通过Xcode和默认编译器)抱怨错误"使用未声明的标识符' G_STMT_START'"我知道这不是一个范围问题,我把宏放在哪里(在我的.h中包含的名为globals.h的头文件中)因为编译器没有抱怨GIMP_CAIRO_ARGB32_SET_PIXEL定义。
有谁知道这里发生了什么?我试图浏览GIMP源中的所有G_STMT_START实例,但未找到任何似乎定义G_STMT_START / G_STMT_END的内容。我也发现了an explanation in the GIMP toolkit documentation,但它远没有用(至少对我来说)。
这是我尝试使用的完整宏:
/**
* 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
感谢您对此提供任何帮助!
答案 0 :(得分:2)
我不知道这可能是什么(虽然现在我知道,我告诉自己我可能已经猜到了),但所有需要知道的是将G_STMT_START
输入Google并点击在the first result。
该页面,来自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
从那时起,很明显这些宏只是在实现the standard idiom,除了在GCC上,他们使用的扩展名正是为了这个目的。
我认为GIMP代码的其他部分将依赖于Glib标头,因此如果您使用其代码,您可能希望包含它们。但如果没有,这里有足够的信息来实现代码的相关部分。
答案 1 :(得分:1)
G_STMT_START
和G_STMT_END
是gimp依赖的Gnome Glib库中的宏。
它们在gmacros.h
中定义。