problem with macro function generation

Paul Lange palango at gmx.de
Tue Aug 14 22:55:21 PDT 2012


Hey,

I have an interface GESMetadataContainer which should provide getter and
setter functions for different data types. As this are quite a few I
tried to create macros to do this. The one for getter functions work
fine (based on the one in gsttaglist.c) but I'm having a hard time with
the setter macro.

I uploaded the full source files at [1].
A types set function should look like [2] and compiles fine.

I used that to create a macro [3]. 
This compiles if I call it with CREATE_SETTER (boolean, gboolean,
G_TYPE_BOOLEAN);
However if I call CREATE_GETTER (int, gint, G_TYPE_INT); I get compiler
errors like in [4].

I don't have any idea how to solve this and hope you can give me some
hints! Thanks in advance.

regards,
Paul


[1] http://palango.fedorapeople.org/ges/

[2]

void
ges_metadata_container_set_int (GESMetadataContainer * container,
    const gchar * metadata_item, gboolean value)
{
  GESMetadata
*data;                                                       
                                                                           
  g_return_if_fail (GES_IS_METADATA_CONTAINER
(container));                
  g_return_if_fail (metadata_item !=
NULL);                                
                                                                           
  data = ges_metadata_container_get_data
(container);                      
                                                                           
  GES_METADATA_LOCK
(data);                                                
  ges_metadata_register (metadata_item,
G_TYPE_INT);                          
  gst_tag_list_add (data->list, data->mode, metadata_item, value,
NULL);   
  GES_METADATA_UNLOCK (data);
}

---------------------------------------------------------------

[3]

#define CREATE_SETTER(name,type,gtype)                                 \
void                                                                   \
ges_metadata_container_set_ ## name (GESMetadataContainer *container,  \
                           const gchar *metadata_item, type value)     \
{                                                                      \
  GESMetadata *data;                                                   \
                                                                       \
  g_return_if_fail (GES_IS_METADATA_CONTAINER (container));            \
  g_return_if_fail (metadata_item != NULL);                            \
                                                                       \
  data = ges_metadata_container_get_data (container);                  \
                                                                       \
  GES_METADATA_LOCK (data);                                            \
  ges_metadata_register (metadata_item, gtype);                        \
  gst_tag_list_add (data->list, data->mode, metadata_item, value, NULL);
\
  GES_METADATA_UNLOCK (data);                                          \
}

-------------------------------------------

[4]

  CC     libges_1.0_la-ges-metadata-container.lo
ges-metadata-container.c:105:27: error: expected ')'
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:47:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                                                 ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:47:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                                   ^
ges-metadata-container.c:105:27: note: to match this '('
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:22:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                        ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:46:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                                  ^
ges-metadata-container.c:105:27: error: type specifier missing, defaults
to 'int'
      [-Werror,-Wimplicit-int]
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^~~~~~~~~~
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:47:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                                                 ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:47:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                                  ~^
ges-metadata-container.c:105:27: error: expected ')'
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:22:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                        ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:50:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                                      ^
ges-metadata-container.c:105:27: note: to match this '('
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:22:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                        ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:45:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                                 ^
ges-metadata-container.c:105:27: error: type specifier missing, defaults
to 'int'
      [-Werror,-Wimplicit-int]
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^~~~~~~~~~
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:22:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                        ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:38:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                        ~ ^
ges-metadata-container.c:105:27: error: function cannot return function
type 'int ((int))'
CREATE_GETTER (int, gint, G_TYPE_INT);
                          ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:97:22:
note: expanded from:
#define G_TYPE_INT                      G_TYPE_MAKE_FUNDAMENTAL (6)
                                        ^
/home/paul/code/testptv//prefix/include/glib-2.0/gobject/gtype.h:222:37:
note: expanded from:
#define G_TYPE_MAKE_FUNDAMENTAL(x)      ((GType) ((x) <<
G_TYPE_FUNDAMENTAL_SHIFT))
                                         ^
ges-metadata-container.c:105:1: error: type specifier missing, defaults
to 'int' [-Werror,-Wimplicit-int]
CREATE_GETTER (int, gint, G_TYPE_INT);
^~~~~~~~~~~~~
6 errors generated.





More information about the gstreamer-devel mailing list