2010-05-14 52 views
34

मैं एक मैक्रो लिखना चाहता हूं जो उसके पैरामीटर के बूलियन मान के आधार पर कोड थूकता है। तो DEF_CONST(true) को const में विस्तारित किया जाना चाहिए, और DEF_CONST(false) को कुछ भी नहीं बढ़ाया जाना चाहिए।सी प्रीप्रोसेसर: #define के अंदर #if का उपयोग कर?

जाहिर निम्नलिखित काम नहीं करता है, क्योंकि हम #defines अंदर एक और पूर्वप्रक्रमक का उपयोग नहीं कर सकते हैं:

#define DEF_CONST(b_const) \ 
#if (b_const) \ 
    const \ 
#endif 

इसे कैसे करना के बारे में कोई विचार? इसके अलावा

#define DEF_CONST(b_const) DEF_CONST_##b_const 
#define DEF_CONST_true const 
#define DEF_CONST_false 

फिर,

/* OK */ 
DEF_CONST(true) int x; /* expands to const int x */ 
DEF_CONST(false) int y; /* expands to int y */ 

/* NOT OK */ 
bool bSomeBool = true;  // technically not C :) 
DEF_CONST(bSomeBool) int z; /* error: preprocessor does not know the value 
           of bSomeBool */ 

, मैक्रो पैरामीटर प्रदान करने के स्वयं (जैसा की सही ढंग से GMAN और अन्य लोगों द्वारा बताया) DEF_CONST के लिए अनुमति देता है:

+4

इस की बात क्या है? क्या आपके पास एक ठोस उदाहरण है, क्योंकि यह अजीब लगता है ... –

+0

यह भी देखें । उपरोक्त में – Rhubbarb

उत्तर

44

आप इस प्रकार macro token concatenation का उपयोग कर सशर्त, अनुकरण कर सकते हैं:

#define DEF_CONST2(b_const) DEF_CONST_##b_const 
#define DEF_CONST(b_const) DEF_CONST2(b_const) 
#define DEF_CONST_true const 
#define DEF_CONST_false 

#define b true 
#define c false 

/* OK */ 
DEF_CONST(b) int x;  /* expands to const int x */ 
DEF_CONST(c) int y;  /* expands to int y */ 
DEF_CONST(true) int z; /* expands to const int z */ 

आप भी बहुत सी सिंप पर विचार कर सकते हैं लेयर (हालांकि संभावित रूप से कम लचीला):

#if b_const 
# define DEF_CONST const 
#else /*b_const*/ 
# define DEF_CONST 
#endif /*b_const*/ 
+0

टाइपो, बस संपादन चिह्न को याद किया। '# परिभाषित करें DEF_CONST (b_const) CONCATENATE (DEF_CONST_, b_const)'। – GManNickG

+2

यूप - टोकन पेस्टिंग या स्ट्रिंगिंग (''##'' या ''#'') प्रीप्रोसेसर ऑपरेटर लगभग हमेशा वांछित काम करने के लिए संकेत के स्तर की आवश्यकता होती है: http://stackoverflow.com/questions/1767683/c- प्रोग्रामिंग-पूर्वप्रक्रमक-मैक्रो के रूप में टोकन/1769037 # 1769037 –

5

इसे एक पैरामीटरयुक्त मैक्रो के रूप में करना थोड़ा अजीब है।

#ifdef USE_CONST 
    #define MYCONST const 
#else 
    #define MYCONST 
#endif 

तो फिर तुम इस तरह कोड लिख सकते हैं::

MYCONST int x = 1; 
MYCONST char* foo = "bar"; 

और यदि आप के साथ USE_CONST परिभाषित (जैसे आम तौर पर makefile में कुछ -DUSE_CONST या संकलन

क्यों नहीं बस कुछ इस तरह करते हैं कंपाइलर विकल्प) तो यह कॉन्स का उपयोग करेगा, अन्यथा यह नहीं होगा।

संपादित करें: असल में मैं देख रहा हूँ Vlad उसके जवाब के अंत में उस विकल्प को शामिल किया गया है, तो उसके लिए +1 :)

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