Динамическое создание имен функций с помощью макросов

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

С уважением,


person Hyndrix    schedule 27.11.2011    source источник


Ответы (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 есть нечто, называемое "параметры макроса с переменным числом аргументов", но Я никогда не использовал их. Или вы можете заключить свои параметры в круглые скобки в вызове макроса, например:

# 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))
person Greg Hewgill    schedule 27.11.2011