调用用__LINE_构建的函数名

Calling a function name built with __LINE__

本文关键字:函数 LINE 调用 构建      更新时间:2023-10-16

假设,我从下面的代码中构建了一个唯一的函数体:

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

如何调用此函数?

宏定义取自:使用##和__LINE_创建C宏(与定位宏的标记串联(。

否。您不能。因为您无法在运行时确定函数名称。(即呼叫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范围内展开(不在方法内部(。]

用您所指出的SO问题的答案中给出的代码替换代码后,使其工作。。。你不能直接调用这个函数,因为你不能确定它的名称,如果代码改变,它就会改变。我不知道这在代码中是如何有用的(也许扫描一个对象以寻找像Unique_[0-9]+这样的符号?无论如何,这将是一种间接的使用,在代码中,正如所说,你不能可靠地使用它。