On Sat, 23 Aug 2014 11:35:05 +0100
Emmanuele Bassi <eba...@gmail.com> wrote:
> hi;
> 
> On 23 August 2014 11:18, Iñigo Martínez <inigomarti...@gmail.com>
> wrote:
> > Yes, it works, but i doesn't look like the best approach:
> >
> > warning: ISO C forbids passing argument 3 of 'g_hash_table_insert'
> > between function pointer and 'void *' [-Wpedantic]
> 
> drop `-Wpedantic`: it doesn't serve any practical purposes. instead,
> identify a set of warnings that you care about, and use them.
> 
> in this particular case, we're talking about undefined behaviour that
> every compiler that is not a university student project, or an arcane
> compiler for a niche architecture, supports anyway.
> 
> in practice, everything that GLib supports, will also support this
> construct.

As you say, glib requires it to work because it uses this conversion
for its closures.

However, it is not just a convention about undefined behaviour which (in
practice) any modern platform will support.  It is actually defined
behaviour on any POSIX platform, because the POSIX standard _requires_
it to work, for dlsym amongst other things.  It will also work on any
windows platform, as a windows extension.

Furthermore, in C++11 (I am not sure about C11) it is not even undefined
behaviour, but implementation defined behaviour.  It is "conditionally
supported", specifically for the purpose of meeting the requirements of
POSIX:

  "Converting a pointer to a function into a pointer to an object
  type or vice versa is conditionally-supported. The meaning of such a
  conversion is implementation defined, except that if an
  implementation supports conversions in both directions, converting an
  rvalue of one type to the other type and back, possibly with
  different cv-qualification, shall yield the original pointer value." 

You can suppress the warning emitted by gcc with -Wpedantic by casting
through a union, which is also supported by gcc although it technically
breaks C99's strict aliasing rules.  But that is pointless. The direct
C-style cast which POSIX and glib requires to work, and C++11 (and maybe
C11) conditionally permits, is the way to go on this.

Chris
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to