2014-06-30 8 views
10

मैक्रो तर्क में कोई अल्पविराम की अनुमति नहीं है क्योंकि इसे एक से अधिक तर्कों के रूप में माना जाएगा और प्रीप्रोकैसिंग गलत होगा। हालांकि, हम प्रीप्रोसेसर को एक तर्क के रूप में पेश करने के लिए तर्क को संश्लेषित कर सकते हैं। क्या कोई मैक्रो या अन्य तकनीकें हैं जो संलग्न कोष्ठक को हटा सकती हैं?मैक्रो के साथ संलग्न कोष्ठक को कैसे हटाएं?

उदाहरण के लिए

, अगर मैं की तरह

#define MY_MACRO(a, b) ... 

मैक्रो निर्धारित और तरह

MY_MACRO(A<int, double>, text); 

इसका इस्तेमाल गलत हो जाएगा। जैसे

MY_MACRO((A<int, double>), text) 

इसका इस्तेमाल किसी मैक्रो या तकनीक के साथ कोष्ठक दूर करने के लिए ठीक हो जाएगा। बूस्ट केवल प्रकार के लिए BOOST_IDENTITY_TYPE मैक्रो नहीं बल्कि सामान्य मामलों

+1

चारों ओर एक काम - 'typedef ए आईए; MY_MACRO (आईए, टेक्स्ट); ' –

+1

टाइपेडफ सभी प्रीप्रोसेसर हैक्स IMHO –

उत्तर

14
#define ESC(...) __VA_ARGS__ 

तो

MY_MACRO(ESC(A<int, double>), text); 

तुम क्या चाहते हो सकती प्रदान करता है।

+0

वाह से अधिक सुरुचिपूर्ण है। बहुत अच्छा और सरल! – user1899020

+0

वैकल्पिक रूप से ईएससी MY_MACRO में जा सकता है, उदा। '# MYFACRO परिभाषित करें (ए, बी) ईएससी ए (बी)' 'MY_MACRO ((ए ), पाठ);' -> ' (टेक्स्ट);' (परिवर्तनीय घोषणा) –

1

एक सरल हैक variadic मैक्रो का उपयोग करने के लिए हो सकता है:

#define MY_MACRO(a, b...) ... 

तो फिर तुम इसे पसंद का उपयोग कर सकते हैं:

MY_MACRO(text, A<int, double>) 

दूसरा तर्क में अल्पविराम अभी भी तर्क विभाजक के रूप में व्याख्या की है (जिसका अर्थ है मैक्रो को वास्तव में तीन तर्कों के साथ बुलाया जाता है), लेकिन यह मैक्रो के अंदर विस्तारित होता है, जिससे व्यवहार समान होता है। हालांकि, मैक्रो में विविधता तर्क होना चाहिए।

4

यह मैक्रो चाल याक के समाधान के समान है लेकिन पैरामीटर के रूप में स्पष्ट रूप से किसी अन्य मैक्रो में पास होने की आवश्यकता को हटा देती है।

#include <stdio.h> 

#define _Args(...) __VA_ARGS__ 
#define STRIP_PARENS(X) X 
#define PASS_PARAMETERS(X) STRIP_PARENS(_Args X) 

int main() 
{ 
    printf("without macro %d %d %d %d %d %d\n", (5,6,7,8,9,10)); // This actually compiles, but it's WRONG 
    printf("with macro %d %d %d %d %d %d\n", PASS_PARAMETERS((5,6,7,8,9,10))); //Parameter "pack" enclosed in parenthesis 
    return 0; 
} 

बेशक आप एक variadic मैक्रो में PASS_PARAMETERS मैक्रो बनाकर रचनात्मक हो और कई पैरामीटर पैक में दे सकते हैं।

संबंधित मुद्दे