sorry for the noise... thunderbird decided to reorder the mails and I didn't look at the date before replying :<

On 15.12.2014 23:45, Alejandro Mery wrote:


On 30.07.2012 12:04, Jianbin Kang wrote:
Hello,

        In `ev.h', the macro using (type of ev_watch *)(void *)(ev) to
convert `ev' to a required type.
        The (void *) conversion may be used to supress gcc's 'strict
aliasing' warning (not sure).
        This may work in previous version of gcc, but failed with gcc
4.7:
                  warning: dereferencing type-punned pointer will break
strict-aliasing rules [-Wstrict-aliasing]

       The better way is to put all ev_watch type to an union (such as
union ev_any_watcher in "ev.h"),
       and convert the pointer to (union ev_any_watch *).
       For example, the following code can supress strict-aliasing
warning for macro 'ev_init':
              typedef ev_any_watcher ev_any;
              #define ev_init(ev,cb_) do {                    \
                ((ev_any *)(ev))->w.active  =                \
                ((ev_any *)(ev))->w.pending = 0;         \
                ev_set_priority ((ev), 0);                      \
                ev_set_cb ((ev), cb_);                         \
             } while (0)
            # define ev_set_priority(ev,pri)             (   (ev_any
*)(ev))->w.priority = (pri)


       Is there any suggestion?

I usually reimplement ev_foo_init() macros the as static inline
functions with explicit types, and then everything goes smoothly.

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to