使用宏动态创建函数名称

时间:2011-11-27 18:54:01

标签: c macros precompile

我正在尝试创建一个宏(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);

此致

1 个答案:

答案 0 :(得分:5)

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

所以这更接近:

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

然而,这仍然不起作用。您的 args 参数我想包含可变数量的参数。在较新版本的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))