6

我正在尝试创建一个宏(C/C++)来动态创建一个函数。基本上我有一个函数,其名称在“MyClassA”部分有所不同。争论也应该通过宏定义来传递。然后在函数中有一个可变的方法调用,例如“methodForClassA”,同样带有一组可变的参数。

void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) {
Toolbox.methodForClassA(arg1, arg2);
}

这种模式有 40 多个函数。当然,我可以手动或使用脚本创建它们。但是也可以用宏来做到这一点吗?例如这样的事情(不起作用):

# define MACRO_TEST(classname, methodname, args, argsMethod) void Java_somepackage_##classname_fixMethod(##args) {\
    Toolbox.##methodname(##argsMethod);\
} 
MACRO_TEST(MyClassA, methodForClassA, args1, args2)

经过一些实验和阅读文档后,我只能找到如何使用“(”跟随动态部分的模式创建“动态”函数名称:

#define FUNCTION(name, x) int func_##name() { return x;}
FUNCTION(test, 2);

问候,

4

1 回答 1

6

我认为您可能误解了##符号粘贴运算符的目的。您不需要##在每次使用宏参数之前都放置,只有当您想将它与其他一些文本粘贴在一起以在输出中创建一个符号时。因此,您可能会需要它,但并非无处不在。

所以这更接近:

# define MACRO_TEST(classname, methodname, args, argsMethod) \
void Java_somepackage_##classname##_fixMethod(args) {\
    Toolbox.methodname(argsMethod);\
} 
MACRO_TEST(MyClassA, methodForClassA, args1, args2)

但是,这仍然不起作用。我猜你的args参数包含可变数量的参数。在较新版本的 C 中,有一种叫做“可变参数宏参数”的东西,但我从未使用过它们。或者,您可以在宏调用中用括号将参数括起来,如下所示:

# define MACRO_TEST(classname, methodname, args, argsMethod) \
void Java_somepackage_##classname##_fixMethod args  {\
    Toolbox.methodname argsMethod;\
} 
MACRO_TEST(MyClassA, methodForClassA, (int arg1, int arg2), (arg1, arg2))
于 2011-11-27T19:05:21.440 回答