On Fri, Dec 04 2015, Joe Perches <j...@perches.com> wrote: > On Thu, 2015-12-03 at 15:34 -0800, Andrew Morton wrote: >> I've been fiddling with a BUILD_BUG_ON which works outside functions >> using gcc's __COUNTER__ - something like >> >> #define BBO(expr) typedef char __bbo##__COUNTER__[1-2*(!!expr)] > > nit: you need another parenthesis around expr > >> BBO(1 == 1); >> BBO(2 == 2); >> >> but that comes out as >> >> typedef char __bbo__COUNTER__[1-2*(!!1 == 1)]; >> typedef char __bbo__COUNTER__[1-2*(!!2 == 2)]; >> >> instead of >> >> typedef char __bbo0[1-2*(!!1 == 1)]; >> typedef char __bbo1[1-2*(!!2 == 2)]; >> >> There's some trick here but I've forgotten what it is. > > I believe it's something like: > > #define __stringify_2(a, b) a##b > #define __stringify2(a, b) __stringify_2(a, b) > > #define BBO(expr) typedef char __stringify2(bbo, __COUNTER__)[1 - > 2*(!!(expr))]
Let's at least not reinvent two wheels. __UNIQUE_ID exists and does the gluing (which we have __PASTE for, not stringify) etc., and uses __LINE__ as a poor man's fallback for compilers without __COUNTER__ (gcc < 4.3). But I don't see why we even need the unique identifier. What's wrong with 'extern char blabla[1 - 2*(!!(expr))]'? blabla can be declared multiple times without problems - and when it fails, we either get a 'negative size' error or at least some complaint about conflicting declarations. Maybe stick a __always_unused in to prevent gcc from complaining if this declaration is inside a function. Rasmus -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/