Creating C macro with ## and __LINE__ (token concatenation with positioning macro)

后端 未结 2 1731
夕颜
夕颜 2020-11-22 10:28

I want to create a C macro that creates a function with a name based on the line number. I thought I could do something like (the real function would have statements within

2条回答
  •  深忆病人
    2020-11-22 11:04

    The problem is that when you have a macro replacement, the preprocessor will only expand the macros recursively if neither the stringizing operator # nor the token-pasting operator ## are applied to it. So, you have to use some extra layers of indirection, you can use the token-pasting operator with a recursively expanded argument:

    #define TOKENPASTE(x, y) x ## y
    #define TOKENPASTE2(x, y) TOKENPASTE(x, y)
    #define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}
    

    Then, __LINE__ gets expanded to the line number during the expansion of UNIQUE (since it's not involved with either # or ##), and then the token pasting happens during the expansion of TOKENPASTE.

    It should also be noted that there is also the __COUNTER__ macro, which expands to a new integer each time it is evaluated, in case you need to have multiple instantiations of the UNIQUE macro on the same line. Note: __COUNTER__ is supported by MS Visual Studio, GCC (since V4.3), and Clang, but is not standard C.

提交回复
热议问题