函数

GObjectTypeValueCollectFunc

自: 2.78

说明

gchar*
(* GTypeValueCollectFunc) (
  GValue* value,
  guint n_collect_values,
  GTypeCValue* collect_values,
  guint collect_flags
)

说明 [src]

此函数负责将从变参元组中收集的值转换为适合存储在 GValue 中的内容。

此函数应类似于 GTypeValueInitFunc 来设置 value;例如,对于不允许 NULL 指针的字符串值,它需要发出错误,或通过存储空字符串来执行隐式转换。

传递给此函数的 value 具有零填充的数据数组,因此就像 GTypeValueInitFunc 一样,它保证不包含任何可能需要释放的旧内容。

n_collect_values 参数是 GTypeValueTablecollect_format 字段的字符串长度,collect_valuesGTypeCValue 数组,长度为 n_collect_values,其中包含根据 collect_format 收集的值。

collect_flags 参数由调用者作为提示提供。它可能包含标记 G_VALUE_NOCOPY_CONTENTS,表示在 value 生命周期期间收集的值内容可以被视为“静态”。因此,不必为存储在 collect_values 中的内容额外交付一份副本以分配到 value

就我们上面的字符串示例而言,我们继续使用

if (!collect_values[0].v_pointer)
  value->data[0].v_pointer = g_strdup ("");
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
  {
    value->data[0].v_pointer = collect_values[0].v_pointer;
    // keep a flag for the `value_free()` implementation to not free this string
    value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
  }
else
  value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
return NULL;

需要注意的是,通常情况下,对引用计数类型的 G_VALUE_NOCOPY_CONTENTS 提示进行遵循都是不好的做法。由于重新进入要求和信号发出代码执行的引用计数断言,应该始终为存储在 value->data 数组中的引用计数内容递增引用计数。以 GObjectGTypeValueTable.collect_value() 的示例实现为例,来看离开我们的字符串示例一小会儿

GObject *object = G_OBJECT (collect_values[0].v_pointer);
g_return_val_if_fail (object != NULL,
   g_strdup_printf ("Object %p passed as invalid NULL pointer", object));
// never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types
value->data[0].v_pointer = g_object_ref (object);
return NULL;

对象的引用计数始终递增,而与 collect_flags 无关。对于无效对象,示例会返回一个新分配的字符串,而不改变 value

成功后,collect_value() 需要返回 NULL。但是,如果发生错误情况,collect_value() 应返回一个新分配的字符串,其中包含错误诊断。

调用代码对错误返回无效时 value 内容的有效性不做任何假设,value 只是被丢弃,而不需要进一步释放。因此,最好在返回错误之前不对 GValue 内容进行分配;不过,collect_values() 并不一定必须为错误返回返回一个正确设置的 value,仅仅是因为任何非 NULL 返回都被视为致命编程错误,而程序的进一步行为是未定义的。

自版本 2.78 起可用

参数

value

类型: GValue

要初始化的值。

数据由函数的调用者所有。
n_collect_values

类型: guint

收集的值的数量。

collect_values

类型: GTypeCValue 数组

收集的值。

数组的长度在 n_collect_values 参数中指定。
数据由函数的调用者所有。
collect_flags

类型: guint

可选标记。

返回值

类型: gchar*

成功时返回 NULL,否则在失败时返回一个新分配的错误字符串。

函数的调用者对数据拥有所有权,并负责释放它。
返回值可以为 NULL
该值是 NUL 终止的 UTF-8 字符串。