Динамическое создание имен функций с помощью макросов - PullRequest
6 голосов
/ 27 ноября 2011

Я пытаюсь создать макрос (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 Ответ

5 голосов
/ 27 ноября 2011

Я думаю, вы, возможно, неправильно поняли назначение оператора вставки символа ##. Вам не нужно ставить ## перед каждым использованием аргумента макроса, только когда вы хотите вставить его вместе с другим текстом для создания одного символа в выводе. Так что, вероятно, оно вам понадобится, но не везде.

Так что это ближе:

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