如何使用c宏生成函数名称

hhw*_*ora 4 c c++ macros

宏"VER"在其他一些头文件中定义为"((u_long)1)",我无法更改.

在我的代码中,我需要使用"test"和VER组合函数"test_1".但是编译器报告错误,因为它是"test _((u_long)1)"而不是"test_1"生成的.

我的问题是:如何编写宏以便它可以生成"test_1"?

提前致谢!

#define VER ((u_long)1)      /* This is defined in some other header file which I can't change*/

#define paste(x, y, z) x ## y ## z
#define paste2(x, y, z) paste(x, y, z)
#define fcall(fname) paste2(fname, _, VER)

int test_1() {
  return 0;
}

int main() {
  fcall( test )();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 6

我无法保证100%便携,但它应该工作:

#define VER ((u_long)1)

#define STRIP1(x) STRIP2 x

#define STRIP2(x) STRIP3 x

#define STRIP3(x)

#define paste(x, y, z) x ## y ## z
#define paste2(x, y, z) paste(x, y, z)
#define fcall(fname) paste2(fname, _, STRIP1(VER))
Run Code Online (Sandbox Code Playgroud)

实例

它的工作原理是解释VER宏调用定义中的括号.这是个别扩展,因为它们发生:

STRIP1(VER) // STRIP1 with argument VER

STRIP2 ((u_long)1) // STRIP2 with argument (u_long)1

STRIP3 (u_long)1  // STRIP3 with argument u_long, followed by 1

1
Run Code Online (Sandbox Code Playgroud)

如果我们重新安排空白(无论如何都是无关紧要的),我们得到这个:

STRIP1(VER)

STRIP2((u_long) 1)

STRIP3(u_long) 1

1
Run Code Online (Sandbox Code Playgroud)