2011-11-27 20 views
5

Dinamik olarak bir işlev oluşturmak için makro (C/C++) oluşturmaya çalışıyorum. Temelde adı "MyClassA" bölümünde değişen bir işlev var. Ayrıca, tartışmalar makro tanımdan geçirilmelidir. Daha sonra, fonksiyonun içinde değişken bir metot çağrısı vardır, örneğin değişken bir dizi tartışma ile birlikte "methodForClassA".Makrolarla işlev adlarının dinamik oluşturulması

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

Bu kalıpta 40'tan fazla işlev var. Elbette el ile veya bir komut dosyasıyla oluşturabilirim. Ama bunu bir makro ile yapmak da mümkün mü? (Çalışmıyor) böyle örnek bir şey için: Bir "(" dinamik aşağıdaki nerede bazı deneyler ve dokümanlar okunmasından sonra

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

, sadece desenleri ile "dinamik" işlevi adları oluşturmak nasıl bulabiliriz kısmı:.

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

Selamlar,

cevap

4

sana ## sembol yapıştırarak operatörü amacını yanlış anlama olabilir düşünüyorum sen yalnızca bir makro argüman her kullanımda önüne ## koymak gerekmez sen Çıktının içinde bir sembol oluşturmak için başka bir metinle birlikte yapıştırmak istiyorum. Yani, muhtemelen buna ihtiyacınız olacak, ama her yerde değil.

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

Ancak, bu hala çalışmıyor:

Yani bu daha yakın. kodunuz parametresinde değişkendir. C'nin daha yeni sürümlerinde, "variadic macro parameters" adlı bir şey var ama onları hiç kullanmadım. Ya da parametrelerinizi makro çağırma sırasında parantez içinde sarabilirsiniz:

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