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.