调用用__LINE__构建的函数名

时间:2011-07-02 09:13:06

标签: c++ macros c-preprocessor

假设我已经从下面的代码构建了一个独特的函数体:

#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)

2 个答案:

答案 0 :(得分:1)

没有。你不能。因为您无法在运行时确定函数名称。 (即要么致电Unique_22Unique_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>