使用宏动态创建函数名

Posted

技术标签:

【中文标题】使用宏动态创建函数名【英文标题】:Dynamic creation of function names with macros 【发布时间】:2011-11-27 18:54:00 【问题描述】:

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

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

所以这更接近:

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

【讨论】:

以上是关于使用宏动态创建函数名的主要内容,如果未能解决你的问题,请参考以下文章

SAS PROC SQL SELECT INTO 宏创建的动态范围

Postgresql函数用动态表名创建表?

MFC SDI中 如何为动态创建的按钮添加消息处理函数

初识MFC----动态创建机制

12UMG动态控制显示内容

如何设置具有动态日期的电子邮件模板,或者创建一个宏来插入日期?