使用宏动态创建函数名称

Hyn*_*rix 6 c macros precompile

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

void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) {
Toolbox.methodForClassA(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)

这种模式有40多种功能.当然我可以手动或用脚本创建它们.但是用宏来做这个也有可能吗?比如像这样的东西(不起作用):

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

经过一些实验和阅读文档,我只能找到如何创建"动态"函数名称的模式,其中"("跟在动态部分之后:

#define FUNCTION(name, x) int func_##name() { return x;}
FUNCTION(test, 2);
Run Code Online (Sandbox Code Playgroud)

问候,

Gre*_*ill 5

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

所以这更接近:

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

但是,这仍然行不通。我猜您的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))
Run Code Online (Sandbox Code Playgroud)