2011-11-27 52 views
5

我想創建一個宏(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); 

問候,

回答

4

我想你可能誤解了##符號粘貼操作的目的,你並不需要把##在每次使用宏的說法面前,只有當您想要將其與其他文本一起粘貼在輸出中創建一個符號。所以,你可能需要它,但不是到處都是。

因此,這是更接近:

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

然而,這仍然無法正常工作。您的參數參數我猜想包含可變數量的參數。在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))