2011-11-27 19 views
5

Estoy intentando crear una macro (C/C++) para crear dinámicamente una función. Básicamente tengo una función cuyo nombre varía en la parte "MyClassA". También los argumentos deben pasar a través de la definición de macro. Luego hay una llamada a método variable dentro de la función, por ejemplo "methodForClassA", nuevamente con un conjunto variable de argumentos.Creación dinámica de nombres de funciones con macros

void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) { 
Toolbox.methodForClassA(arg1, arg2); 
} 

Hay más de 40 funciones con este patrón. Por supuesto que puedo crearlos manualmente o con un script. Pero, ¿también es posible hacer esto con una macro? Por ejemplo algo como esto (que no funciona):

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

Después de algunos experimentos y lectura de documentos, sólo pude encontrar la manera de crear nombres de función "dinámicas" con patrones donde un "(" sigue la dinámica parte:.

#define FUNCTION(name, x) int func_##name() { return x;} 
FUNCTION(test, 2); 

Saludos,

Respuesta

4

Creo que es posible que la mala interpretación del propósito del operador pegar ## símbolo no es necesario poner ## delante de cada uso de un argumento macro, sólo cuando tú desea pegarlo junto con algún otro texto para crear un símbolo en la salida. Entonces, probablemente lo necesite, pero no en todas partes.

Así que esto está más cerca:

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

Sin embargo, esto todavía no funciona. Su parámetro args supongo que contiene una cantidad variable de parámetros. En las versiones más nuevas de C, hay algo llamado "variadic macro parameters" pero nunca los he usado. O bien, podría rodear sus parámetros con paréntesis en la macro llamada, como esta:

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