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