1

The following (test with gcc -E blah.c):

#define UNUSED(type) type UNUSED_ ## __COUNTER__
UNUSED(char const *)
UNUSED(int)

Generates:

char const * UNUSED__COUNTER__
int UNUSED__COUNTER__

I'm expecting:

char const * UNUSED0
int UNUSED1

I've tried calling another macro, wrapping the arguments in brackets to no avail. If I don't paste the tokens it seems to work fine. The documentation specifically mentions the use of __COUNTER__ in token pasting.

What am I doing wrong?

Matt Joiner
  • 112,946
  • 110
  • 377
  • 526

3 Answers3

1

__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.

Georg Fritzsche
  • 97,545
  • 26
  • 194
  • 236
1

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.

zwol
  • 135,547
  • 38
  • 252
  • 361
-1

I believe you must "double expand" it:

#define STR(x)    #x
#define UNUSED(type) type UNUSED_ ## STR(__COUNTER__)
UNUSED(char const *) 
UNUSED(int) 
James Curran
  • 101,701
  • 37
  • 181
  • 258