Chethan
Chethan

Reputation: 933

Calling a function name built with __LINE__

Suppose, I have built an unique function body from below code:

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

How can I call this function ?

Macro definition taken from: Creating C macro with ## and __LINE__ (token concatenation with positioning macro).

Upvotes: 0

Views: 580

Answers (2)

iammilind
iammilind

Reputation: 69958

No. You cannot. Because you cannot determine a function name at runtime. (i.e. either to call Unique_22 or Unique_44. However you can definitely call Unique<22> or Unique<44>)

So you can use template solution instead. Declare Unique as below:

template<unsigned int LINE> void Unique ();

And #define the macro like this:

#define UNIQUE template<> Unique<__LINE__>() {}

I advice to use __COUNTER__ instead of __LINE__ if your compiler supports it. [Note: which means that in any line you can call the UNIQUE only once and also the macro should be expanded in global or namespace scope (not inside a method).]

Upvotes: 1

ShinTakezou
ShinTakezou

Reputation: 9661

After replacing the code with the one given in the answer to the SO question you pointed so that it works, ... you can't call this function directly since you can't know for sure its name, that will change if the code change. I have no clue about how this can be useful in code (maybe scanning an object for symbol like Unique_[0-9]+? Anyway, it would be an indirect use, in code, as said, you can't use it reliably.

Upvotes: 0

Related Questions