假设我已经从下面的代码构建了一个独特的函数体:
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void)
如何调用此功能?
宏定义取自:Creating C macro with ## and __LINE__ (token concatenation with positioning macro)。
答案 0 :(得分:1)
没有。你不能。因为您无法在运行时确定函数名称。 (即要么致电Unique_22
或Unique_44
。但您绝对可以致电Unique<22>
或Unique<44>
)
因此,您可以使用template
解决方案。声明Unique
如下:
template<unsigned int LINE> void Unique ();
#define
像这样的宏:
#define UNIQUE template<> Unique<__LINE__>() {}
如果您的编译器支持,我建议使用__COUNTER__
而不是__LINE__
。
[注意:这意味着在任何行中您只能调用UNIQUE
一次,并且宏应该在全局或namespace
范围内扩展(不在方法内)。]
答案 1 :(得分:0)
用您指出的SO问题的答案中给出的代码替换代码以使其有效,...您无法直接调用此函数,因为您无法确切知道其名称,这将改变如果代码改变了我不清楚这在代码中是如何有用的(可能是像Unique_[0-9]+
这样的符号扫描对象?无论如何,它会间接使用,在代码中,如上所述,你不能可靠地使用它。 / p>