On Fri, Dec 13, 2013 at 02:42:23PM -0500, Trevor Saunders wrote:
> On Wed, Dec 11, 2013 at 08:33:03PM +0530, Prathamesh Kulkarni wrote:
> > I was wondering if it was a good idea to replace do-while macros with
> > static inline functions returning void, where appropriate ?
> > By "where appropriate" I mean:
> > a) call to macro contains no side-effects
> > b) macro does not modify the arguments.
> > c) macro does not use any preprocessor operators (like ##)
> > d) macro does not get undefined or is conditionally defined.
> > e) macro is not type independent (use inline template for these?)
> > f) Any other case ?
> 
> in general I'm infavor of replacing macros with unctions / constants /
> templates etc.
> 
> > Example:
> > Consider C_EXPR_APPEND macro defined in c-tree.h:
> > 
> > /* Append a new c_expr_t element to V.  */
> > #define C_EXPR_APPEND(V, ELEM) \
> >   do { \
> >     c_expr_t __elem = (ELEM); \
> >     vec_safe_push (V, __elem); \
> >   } while (0)
> 
> Its not my code, but that macro looks like a totally useless
> abstruction, why not just inline the vec_safe_push() ?
> 
Anyway if you inline macros you typically need to use always_inline.

Quite often gcc makes mistake of not inlining these, a body looks much
larger than actual inline expansion. Which is understandable as reason
of macro could be avoiding a function call overhead. 

Reply via email to