The following (test with gcc -E blah.c
):
#define UNUSED(type) type UNUSED_ ## __COUNTER__
UNUSED(char const *)
UNUSED(int)
Generat
__COUNTER__
was only introduced in GCC 4.3 - if you happen to use an earlier version, the macro is simply not defined. In that case Boost.PPs BOOST_PP_COUNTER
macro might be worth looking into.
On newer GCC versions you still need a different approach to concatenation, as ##
prevents its arguments from expanding. Thus you have to expand them first before using ##
:
#define CAT(a, b) CAT_I(a, b)
#define CAT_I(a, b) CAT_II(a ## b)
#define CAT_II(x) x
#define UNUSED(type) type CAT(UNUSED_, __COUNTER__)
If you're already using Boost, BOOST_PP_CAT()
gives you the same functionality.
I believe you must "double expand" it:
#define STR(x) #x
#define UNUSED(type) type UNUSED_ ## STR(__COUNTER__)
UNUSED(char const *)
UNUSED(int)
Experimenting with gcc 4.4, this works:
#define UNUSED(type) UNUSED_(type, __COUNTER__)
#define UNUSED_(type, counter) UNUSED__(type, counter)
#define UNUSED__(type, counter) type UNUSED_ ## counter
UNUSED(char const *)
UNUSED(int)
But it doesn't work if I take out even one level of intermediates.