From d2ca14c270a8a0c01d8a897fad4ea2a9c2e31105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Sun, 17 Jul 2011 21:18:04 +0200 Subject: [PATCH] Add G_VALUE_INIT The implementation of GValue is not public or documented. When allocated on the stack, initializing a GValue is usually done as documented with: GValue value = { 0, }; There is lot code around (including WebKit) that added all the missing fields, resulting in this ugly and non-obvious: GValue value = { 0, { { 0 } } }; However, this doesn't play nice with -Wmissing-field-initializers for example. Thus, G_VALUE_INIT. http://bugzilla.gnome.org/show_bug.cgi?id=654793 http://bugzilla.gnome.org/show_bug.cgi?id=577231 --- docs/reference/gobject/gobject-sections.txt | 1 + gobject/gvalue.c | 6 +++--- gobject/gvalue.h | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/reference/gobject/gobject-sections.txt b/docs/reference/gobject/gobject-sections.txt index fefe1b783..0b1483a25 100644 --- a/docs/reference/gobject/gobject-sections.txt +++ b/docs/reference/gobject/gobject-sections.txt @@ -376,6 +376,7 @@ g_variant_type_get_gtype
Generic values generic_values +G_VALUE_INIT G_VALUE_HOLDS G_VALUE_TYPE G_VALUE_TYPE_NAME diff --git a/gobject/gvalue.c b/gobject/gvalue.c index 775747460..bca9aa5d1 100644 --- a/gobject/gvalue.c +++ b/gobject/gvalue.c @@ -73,9 +73,9 @@ * main (int argc, * char *argv[]) * { - * /* GValues must start zero-filled */ - * GValue a = {0}; - * GValue b = {0}; + * /* GValues must be initialized */ + * GValue a = G_VALUE_INIT; + * GValue b = G_VALUE_INIT; * const gchar *message; * * g_type_init (); diff --git a/gobject/gvalue.h b/gobject/gvalue.h index 60c19199d..e1f69806b 100644 --- a/gobject/gvalue.h +++ b/gobject/gvalue.h @@ -161,6 +161,22 @@ void g_value_register_transform_func (GType src_type, */ #define G_VALUE_NOCOPY_CONTENTS (1 << 27) +/** + * G_VALUE_INIT: + * + * A #GValue must be initialized before it can be used. + * This macro can be used as initializer instead of an explicit + * { 0 } when declaring a variable, + * but it cannot be assigned to a variable. + * + * |[ + * GValue value = G_VALUE_INIT; + * ]| + * + * Since: 2.30 + */ +#define G_VALUE_INIT { 0, { { 0 } } } + G_END_DECLS