- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在从 GIMP source code base 移植一些代码进入我正在编写的程序。部分代码 (/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 的东西。我的编译器(通过 Xcode 使用默认编译器的 Mac OSX)提示错误“使用未声明的标识符'G_STMT_START'”我知道这不是我放置宏的位置的范围问题(在名为 globals.h 的头文件中)我包含在我的 .h) 中,因为编译器没有提示 GIMP_CAIRO_ARGB32_SET_PIXEL 定义。
有人知道这里发生了什么吗?我试图通过 grep 搜索 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
感谢您对此的任何帮助!
最佳答案
我也不知道这可能是什么(虽然现在我知道了,但我告诉自己我可能已经猜到了),但我所要做的就是输入 G_STMT_START
谷歌并点击 the first result .
Glib 手册中的该页面显示它是一个设计用于多语句宏的宏。
G_STMT_START
#define G_STMT_START
Used within multi-statement macros so that they can be used in places where only one statement is expected by the compiler.
G_STMT_END
#define G_STMT_END
Used within multi-statement macros so that they can be used in places where only one statement is expected by the compiler.
稍后在搜索结果中,您将获得一份或多份 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 header ,因此如果您使用它的代码,您可能希望包含它们。但如果没有,这里有足够的信息让您自己实现代码的相关部分。
关于c++ - 什么是 G_STMT_START 和 G_STMT_END?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23209951/
我正在从 GIMP source code base 移植一些代码进入我正在编写的程序。部分代码 (/gimp-2.8.10//modules/display-filter-color-blind.c
我是一名优秀的程序员,十分优秀!