2011-11-27 20 views
5

के साथ फ़ंक्शन नामों की गतिशील रचना मैं गतिशील रूप से फ़ंक्शन बनाने के लिए मैक्रो (सी/सी ++) बनाने की कोशिश कर रहा हूं। असल में मेरे पास एक ऐसा कार्य है जिसका नाम "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) 

हालांकि, यह अभी भी काम नहीं करता:

तो यह करीब है। आपका तर्क पैरामीटर मुझे लगता है कि पैरामीटर की एक चर संख्या है। सी के नए संस्करणों में, "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)) 
संबंधित मुद्दे