Search code examples
c++macrosidentifier

Macro to create multiple similar identifiers for testing


I wanted to write a simple macro to expand some identifiers so it saves me the work of typing everything again and again when I have similar code to test for many different classes.

I wanted something like this:

#define TST(x)  x## x##_1(2);                   \
                x## x##_2;                      \
                                                \
                x##_1.print(cout);              \
                x##_2.print(cout);              \
                x##_2.elem(3);                  \
                x##_2.elem(4);                  \
                x##_2.print(cout)

To be translated into

Pentagonal Pentagonal_1(2);
Pentagonal Pentagonal_2;

Pentagonal_1.print(cout);
Pentagonal_2.print(cout);
Pentagonal_2.elem(3);
Pentagonal_2.elem(4);
Pentagonal_2.print(cout);

whenever I call

TST(Pentagonal);

so far it is being translated glued together like

PentagonalPentagonal_1

I tried searching for this but in this specific case I couldn't find much help elsewhere.


Solution

  • Change:

    #define TST(x)  x## x##_1(2);                   \
                    x## x##_2;                      \
    
    ...
    

    to

    #define TST(x)  x x##_1(2);                   \
                    x x##_2;                      \
    
    ...
    

    ## is the token-paste operator: It "absorbs" surrounding whitespace and joins neighboring tokens into one.

    The extras you had up there were pasting the Pentagonal and Pentagonal_1 together.