特殊宏(Miscellaneous Macros)

特殊宏(Miscellaneous Macros) — 不常使用的专用宏

Synopsis

#include <glib.h>

#define             G_INLINE_FUNC

#define             G_STMT_START
#define             G_STMT_END

#define             G_BEGIN_DECLS
#define             G_END_DECLS

#define             G_N_ELEMENTS                        (arr)

#define             G_VA_COPY                           (ap1,
                                                         ap2)

#define             G_STRINGIFY                         (macro_or_string)
#define             G_PASTE                             (identifier1,
                                                         identifier2)
#define             G_STATIC_ASSERT                     (expr)

#define             G_GNUC_EXTENSION
#define             G_GNUC_CONST
#define             G_GNUC_PURE
#define             G_GNUC_MALLOC
#define             G_GNUC_ALLOC_SIZE                   (x)
#define             G_GNUC_ALLOC_SIZE2                  (x,
                                                         y)
#define             G_GNUC_DEPRECATED
#define             G_GNUC_DEPRECATED_FOR               (f)
#define             G_GNUC_NORETURN
#define             G_GNUC_UNUSED
#define             G_GNUC_PRINTF                       (format_idx,
                                                         arg_idx)
#define             G_GNUC_SCANF                        (format_idx,
                                                         arg_idx)
#define             G_GNUC_FORMAT                       (arg_idx)
#define             G_GNUC_NULL_TERMINATED
#define             G_GNUC_WARN_UNUSED_RESULT
#define             G_GNUC_FUNCTION
#define             G_GNUC_PRETTY_FUNCTION
#define             G_GNUC_NO_INSTRUMENT
#define             G_HAVE_GNUC_VISIBILITY
#define             G_GNUC_INTERNAL
#define             G_GNUC_MAY_ALIAS

#define             G_LIKELY                            (expr)
#define             G_UNLIKELY                          (expr)

#define             G_STRLOC
#define             G_STRFUNC

#define             G_GINT16_MODIFIER
#define             G_GINT16_FORMAT
#define             G_GUINT16_FORMAT
#define             G_GINT32_MODIFIER
#define             G_GINT32_FORMAT
#define             G_GUINT32_FORMAT
#define             G_GINT64_MODIFIER
#define             G_GINT64_FORMAT
#define             G_GUINT64_FORMAT
#define             G_GSIZE_MODIFIER
#define             G_GSIZE_FORMAT
#define             G_GSSIZE_FORMAT
#define             G_GOFFSET_MODIFIER
#define             G_GOFFSET_FORMAT
#define             G_GINTPTR_MODIFIER
#define             G_GINTPTR_FORMAT
#define             G_GUINTPTR_FORMAT

Description

这些宏提供了额外特殊的功能,它们通常不被应用程序员使用

Details

G_INLINE_FUNC

#  define G_INLINE_FUNC

这个宏用于导出函数原型,这样当非内联模式时,它们就能被链接 到一个非内联的扩展版本。执行函数的这个文件要在定义G_IMPLEMENTS_INLINTS 之前包含有G_INLINE_FUNC声明的头文件。由于内联是非常依赖 编译器的,所以正确的使用这些宏非常难。强烈建议不要使用这 些宏。

此宏经常被误认为是inline关键字的替换;内联已经以一种可移 植的方式在glib头文件里声明,并且它能够被正常的使用。


G_STMT_START

#  define G_STMT_START  do

在多语句宏内使用,以便它们能使用在编译器期望只有一条语句 的地方。


G_STMT_END

#  define G_STMT_END    while (0)

在多语句宏内使用,以便它们能使用在编译器期望只有一条语句 的地方。


G_BEGIN_DECLS

# define G_BEGIN_DECLS  extern "C" {

用于把头文件放在括号{}里(和G_END_DECLS一起使用)。如果 使用的编译器是一个C++编译器,就在头文件外添加 extern "C"


G_END_DECLS

# define G_END_DECLS    }

用于把头文件放在括号{}里(和G_END_DECLS一起使用)。如果 使用的编译器是一个C++编译器,就在头文件外添加 extern "C"


G_N_ELEMENTS()

#define G_N_ELEMENTS(arr)		(sizeof (arr) / sizeof ((arr)[0]))

确定数组中元素的个数。这个数组必须被声明以便编译器在编译 时知道它的大小;这个宏不能工作在堆上分配的数组上,只能应 用在静态数组或者在栈上的数组。

arr :

数组名

G_VA_COPY()

#define             G_VA_COPY(ap1,ap2)

以可移植的方式复制 va_list 变量。

为了使用这个功能,你必须包含string.h ,因为这个宏可能使用 memmove(),而 GLib并没有包含string.h

ap1 :

这个 va_list 变量用于存放ap2的一个副本。

ap2 :

一个 va_list 变量。

G_STRINGIFY()

#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string)

接受一个宏或一个字符串转换成一个字符串后,并预处理参数扩展。 preprocessor argument expansion. For example, the following code:

#define AGE 27
const gchar *greeting = G_STRINGIFY (AGE) " today!";

is transformed by the preprocessor into (code equivalent to):

const gchar *greeting = "27 today!";

macro_or_string :

一个宏或者一个字符串。

G_PASTE()

#define G_PASTE(identifier1,identifier2)      G_PASTE_ARGS (identifier1, identifier2)

生成一个新的预处理粘贴标识符'identifier1identifier2' 从它的形参 'identifier1' 和 'identifier2'。

#define GET(traveller,method) G_PASTE(traveller_get_, method) (traveller)
const gchar *name = GET (traveller, name);
const gchar *quest = GET (traveller, quest);
GdkColor *favourite = GET (traveller, favourite_colour);

is transformed by the preprocessor into:

const gchar *name = traveller_get_name (traveller);
const gchar *quest = traveller_get_quest (traveller);
GdkColor *favourite = traveller_get_favourite_colour (traveller);

identifier1 :

一个标识符

identifier2 :

一个标识符

Since 2.20


G_STATIC_ASSERT()

#define G_STATIC_ASSERT(expr) typedef struct { char Compile_Time_Assertion[(expr) ? 1 : -1]; } G_PASTE (_GStaticAssert_, __LINE__)

G_STATIC_ASSERT 宏让程序员可以在代码编译时进行条件检查,该 条件必须在程序编译时是可计算的。 这个宏可以使用在任何使用 typedef的地方。 这个宏只能在每个源代码行使用一次。

expr :

一个常量表达式。

Since 2.20


G_GNUC_EXTENSION

#  define G_GNUC_EXTENSION __extension__

当使用 gcc 作为编译器时展开为 __extension__。 这简单的告诉 gcc 当使用 -pedantic 参数进行编译时,对于以下的非标准代码不用做出警告。


G_GNUC_CONST

#define             G_GNUC_CONST

如果使用的是 gcc 编译器,就展开为 GNU C const 函数属性。将一个函数声明为const, 可以更好地对函数调用进行优化。 一个const函数不检查其参数 外的任何值,并且只影响到它的返回值。详见GNU C 文档。

Note

一个函数的指针参数和此指针所指向的数据不能 被声明为const。同样的,一个调用非const函数的函数通常不能为const。 为一个const函数返回void是没意义的。


G_GNUC_PURE

#define             G_GNUC_PURE

如果使用的是 gcc 编译器,就展开为 GNU C pure 函数属性。将一个函数声明为pure, 可以更好地对函数调用进行优化。一个pure函数只影响它的返回值, 并且这个返回值只依赖于参数和/或全局变量。 详见GNU C 文档。


G_GNUC_MALLOC

#define             G_GNUC_MALLOC

如果使用的是 gcc 编译器,就展开为 GNU C malloc 函数属性。将一个函数声明为malloc, 可以更好地对函数调用进行优化。一个函数可以拥有malloc属性, 如果能确保在函数返回时,它返回的指针不是其他任意指针的别名的话 (实际上,这意味著分配新的内存)。 详见GNU C 文档。

Since 2.6


G_GNUC_ALLOC_SIZE()

#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))

如果使用的是比较新版的 gcc 编译器,就展开为 GNU C alloc_size 函数属性。这个属性告诉编译器 此函数返回一个指针,该指针指向由函数参数xth指定大小的 内存空间。 详见GNU C 文档。

x :

分配指定大小内存的参数指数。

Since 2.18


G_GNUC_ALLOC_SIZE2()

#define G_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y)))

如果使用的是比较新版的 gcc 编译器,就展开为 GNU C alloc_size 函数属性。 这个属性告诉编译器 此函数返回一个指针,该指针指向由该函数的两个参数的乘积指定大小的 内存空间。 详见GNU C 文档。

x :

分配指定大小内存的第一个参数指数。

y :

分配指定大小内存的第二个参数指数。

Since 2.18


G_GNUC_DEPRECATED

#define             G_GNUC_DEPRECATED

如果使用的是 gcc 编译器,就展开为 GNU C deprecated 属性。 它可以用来标记某些类型定义,变量和函数是不鼓励使用的。 如果你使用了这些不鼓励使用的程序接口,当编译器使用 -Wdeprecated-declarations选项编译时将 产生警告信息。 详见GNU C 文档。

Since 2.2


G_GNUC_DEPRECATED_FOR()

#define             G_GNUC_DEPRECATED_FOR(f)

Like G_GNUC_DEPRECATED, but names the intended replacement for the deprecated symbol if the version of gcc in use is new enough to support custom deprecation messages. See the GNU C documentation for details.

f :

the intended replacement for the deprecated symbol, such as the name of a function

Since 2.25.3


G_GNUC_NORETURN

#define             G_GNUC_NORETURN

如果使用的是 gcc 编译器,就展开为 GNU C noreturn 函数属性。它用来声明 该函数没有返回值。它能够使函数得到优化,同时避免了可能 出现的编译警告。 详见GNU C 文档。


G_GNUC_UNUSED

#define             G_GNUC_UNUSED

如果使用的是 gcc 编译器,就展开为 GNU C unused 函数属性。它用来声明 该函数可能不会被使用。它避免了可能出现的编译警告。 详见GNU C 文档。


G_GNUC_PRINTF()

#define             G_GNUC_PRINTF( format_idx, arg_idx )

如果使用的是 gcc 编译器,就展开为 GNU C format 函数属性。它用来声明 使用了可变数目参数的函数,就像printf() 的语法一样。它允许编译器对传递给函数的参数进行类型检查。 详见GNU C 文档。

gint g_snprintf (gchar  *string,
                 gulong       n,
                 gchar const *format,
                 ...) G_GNUC_PRINTF (3, 4);

format_idx :

对应格式字符串参数的索引。 (这个参数的取值从1开始)。

arg_idx :

第一个格式化参数的索引。

G_GNUC_SCANF()

#define             G_GNUC_SCANF( format_idx, arg_idx )

如果使用的是 gcc 编译器,就展开为 GNU C format 函数属性。它用来声明 使用了可变数目参数的函数,就像scanf() 的语法一样。它允许编译器对传递给函数的参数进行类型检查。 详见GNU C 文档。

format_idx :

对应格式字符串参数的索引。 (这个参数的取值从1开始)。

arg_idx :

第一个格式化参数的索引。

G_GNUC_FORMAT()

#define             G_GNUC_FORMAT( arg_idx )

如果使用的是 gcc 编译器,就展开为 GNU C format_arg 函数属性。 这个函数属性为printf()scanf()strftime() 或者 strfmon() 等类型的函数指定了 函数的格式化字符串,并且修改它,以便结果能传递给 printf()scanf()strftime() 或者 strfmon() 等类型的函数(其他的参数则和它们未修改时一样,保持不变)。 详见GNU C 文档。

gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2);

arg_idx :

参数索引。

G_GNUC_NULL_TERMINATED

#define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))

如果使用的是 gcc 编译器,就展开为 GNU C sentinel 函数属性,或者 "" 如果不是如此的话。这个函数属性仅适用于可变参函数并且 指示编译器检查以一个明确的NULL结束的参数列表。 详见GNU C 文档。

Since: 2.8

G_GNUC_WARN_UNUSED_RESULT

#define             G_GNUC_WARN_UNUSED_RESULT

如果使用的是 gcc 编译器,就展开为 GNU C warn_unused_result 函数属性, 或者 "" 如果不是如此的话。如果一个函数的调用结果被忽 略的话,这个函数属性将使编译器发出一个警告。 详见GNU C 文档。

Since 2.10


G_GNUC_FUNCTION

#define G_GNUC_FUNCTION         __FUNCTION__

Warning

G_GNUC_FUNCTION has been deprecated since version 2.16 and should not be used in newly-written code. 请使用 G_STRFUNC 代替。

在所有的现代编译器上展开为 "" ,并且在gcc 2.x 版本上 展开为__FUNCTION__ 。 不要使用它。


G_GNUC_PRETTY_FUNCTION

#define G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__

Warning

G_GNUC_PRETTY_FUNCTION has been deprecated since version 2.16 and should not be used in newly-written code. 请使用 G_STRFUNC 代替。

在所有的现代编译器上展开为 "" ,并且在gcc 2.x 版本上 展开为__PRETTY_FUNCTION__ 。 不要使用它。


G_GNUC_NO_INSTRUMENT

#define             G_GNUC_NO_INSTRUMENT

如果使用的是 gcc 编译器,就展开为 GNU C no_instrument_function 函数属性。 当编译器使用-finstrument-functions选项 时,拥有这个属性的函数将不会被instrumented for profiling (译者:instrumented for profiling 为性能跟踪的工具、方法、 程序等)。 详见GNU C 文档。


G_HAVE_GNUC_VISIBILITY

#define G_HAVE_GNUC_VISIBILITY 1


G_GNUC_INTERNAL

#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))

这个属性能用来标记仅用于内部的库函数,它可以让编译器更加 高效的调用句柄函数。 请注意,静态函数不能使用这种方式来标记为内部函数。 详见GNU C 文档。

当使用的编译器支持GNU C 隐藏可见性属性时,这个宏被展开为 __attribute__((visibility("hidden")))。 当使用 Sun Studio 编译器时,该宏被展开为__hidden

请注意,为了具备可移植性,这个属性应该放在函数声明的前面。 虽然 GCC 允许这个宏放在函数声明的后面,但是Sun Studio 不允许。

G_GNUC_INTERNAL
void _g_log_fallback_handler (const gchar    *log_domain,
                              GLogLevelFlags  log_level,
                              const gchar    *message,
                              gpointer        unused_data);
Since: 2.6

G_GNUC_MAY_ALIAS

#  define G_GNUC_MAY_ALIAS __attribute__((may_alias))

如果使用的是 gcc 编译器,就展开为 GNU C may_alias 函数属性。 拥有这个属性的数据类型将不会被进行基于类型别名的分析, 但将被假设为其他任意类型的别名,就像 char 类型。 详见GNU C 文档。

Since: 2.14

G_LIKELY()

#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))

这个宏指示编译器,表达式可能为一个真值。编译器可能针对 这个信息进行编译优化。

if (G_LIKELY (random () != 1))
  g_print ("not one");

Returns :

expr 的值

Since 2.2


G_UNLIKELY()

#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))

这个宏指示编译器,表达式可能不是一个真值。编译器可能针对 这个信息进行编译优化。

if (G_UNLIKELY (random () == 1))
  g_print ("a random one");

expr :

表达式

Returns :

expr 的值

Since 2.2


G_STRLOC

#  define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"

展开为一个用于确定当前代码位置的字符串。


G_STRFUNC

#  define G_STRFUNC     ((const char*) (__PRETTY_FUNCTION__))

展开为一个用于确定当前函数位置的字符串。

Since 2.4


G_GINT16_MODIFIER

#define G_GINT16_MODIFIER "h"

平台依赖长度修改量的转换符,用于读入和打印 gint16 或者 guint16 类型的值。这是一个串字面值,但不包括百分比符号, 这样的话你就可以在百分比符号和转换符之间添加精度和长度修改量, 并且追加一个转换符。

下例打印为 "0x7b";

gint16 value = 123;
g_print ("%#" G_GINT16_MODIFIER "x", value);

Since 2.4


G_GINT16_FORMAT

#define G_GINT16_FORMAT "hi"

这是一个平台依赖转换符,用于读入和打印 gint16 类型的值。 这是一个串字面值,但不包括百分比符号,这样的话你就可以在 百分比符号和转换符之间添加精度和长度修改量。

gint16 in;
gint32 out;
sscanf ("42", "%" G_GINT16_FORMAT, &in)
out = in * 1000;
g_print ("%" G_GINT32_FORMAT, out);


G_GUINT16_FORMAT

#define G_GUINT16_FORMAT "hu"

这是一个平台依赖转换符,用于读入和打印 guint16 类型的值。 见 G_GINT16_FORMAT


G_GINT32_MODIFIER

#define G_GINT32_MODIFIER ""

平台依赖长度修改量的转换符,用于读入和打印 gint32 或者 guint32 类型的值。 这是一个串字面值,见 G_GINT16_MODIFIER

Since 2.4


G_GINT32_FORMAT

#define G_GINT32_FORMAT "i"

这是一个平台依赖转换符,用于读入和打印 gint32 类型的值。 见 G_GINT16_FORMAT


G_GUINT32_FORMAT

#define G_GUINT32_FORMAT "u"

这是一个平台依赖转换符,用于读入和打印 guint32 类型的值。 见 G_GINT16_FORMAT


G_GINT64_MODIFIER

#define G_GINT64_MODIFIER "ll"

平台依赖长度修改量的转换符,用于读入和打印 gint64 或者 guint64 类型的值。这是一个串字面。

Note

一些平台不支持打印64位整数,尽管支持这个数据类型。 在这样的平台 G_GINT64_MODIFIER 是未定义的。

Since 2.4


G_GINT64_FORMAT

#define G_GINT64_FORMAT "lli"

这是一个平台依赖转换符,用于读入和打印 gint64 类型的值。 见 G_GINT16_FORMAT

Note

一些平台不支持读入和打印64位整数,尽管支持这个数据类型。 在这样的平台 G_GINT64_FORMAT 是未定义的。 请注意,scanf() 可能不支持64位整数,尽管定义了 G_GINT64_FORMAT。 因为它薄弱的错误处理,无论如何 scanf() 是不推荐解析的; 请考虑使用 g_strtoull() 代替它。


G_GUINT64_FORMAT

#define G_GUINT64_FORMAT "llu"

这是一个平台依赖转换符,用于读入和打印 guint64 类型的值。 见 G_GINT16_FORMAT

Note

一些平台不支持读入和打印64位整数,尽管支持这个数据类型。 在这样的平台 G_GUINT64_FORMAT 是未定义的。 请注意,scanf() 可能不支持64位整数,尽管定义了 G_GINT64_FORMAT。 因为它薄弱的错误处理,无论如何 scanf() 是不推荐解析的; 请考虑使用 g_strtoull() 代替它。


G_GSIZE_MODIFIER

#define G_GSIZE_MODIFIER ""

平台依赖长度修改量的转换符,用于读入和打印 gsize 或者 gssize 类型的值。这是一个串字面。

Since 2.6


G_GSIZE_FORMAT

#define G_GSIZE_FORMAT "u"

这是一个平台依赖转换符,用于读入和打印 gsize 类型的值。 见 G_GINT16_FORMAT

Since 2.6


G_GSSIZE_FORMAT

#define G_GSSIZE_FORMAT "i"

这是一个平台依赖转换符,用于读入和打印 gssize 类型的值。 见 G_GINT16_FORMAT

Since 2.6


G_GOFFSET_MODIFIER

#define G_GOFFSET_MODIFIER      G_GINT64_MODIFIER

平台依赖长度修改量的转换符,用于读入和打印 goffset 类型的值。 这是一个串字面。 见 G_GINT64_MODIFIER

Since 2.20


G_GOFFSET_FORMAT

#define G_GOFFSET_FORMAT        G_GINT64_FORMAT

这是一个平台依赖转换符,用于读入和打印 goffset 类型的值。 见 G_GINT64_FORMAT

Since: 2.20

G_GINTPTR_MODIFIER

#define G_GINTPTR_MODIFIER      ""

The platform dependent length modifier for conversion specifiers for scanning and printing values of type gintptr or guintptr. It is a string literal.

Since 2.22


G_GINTPTR_FORMAT

#define G_GINTPTR_FORMAT        "i"

This is the platform dependent conversion specifier for scanning and printing values of type gintptr.

Since 2.22


G_GUINTPTR_FORMAT

#define G_GUINTPTR_FORMAT       "u"

This is the platform dependent conversion specifier for scanning and printing values of type guintptr.

Since 2.22