2011-11-27 51 views
5

我想创建一个宏(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

我想你可能误解了##符号粘贴操作的目的,你并不需要把##在每次使用宏的说法面前,只有当您想要将其与其他文本一起粘贴在输出中创建一个符号。所以,你可能需要它,但不是到处都是。

因此,这是更接近:

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

然而,这仍然无法正常工作。您的参数参数我猜想包含可变数量的参数。在C的新版本中,有一些叫做"variadic macro parameters"的东西,但我从来没有用过它们。或者,你可以用括号括起来的参数在宏调用,就像这样:

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