2010-04-19 17 views
9

क्या सी ++ में मैक्रो में मैक्रो डालना संभव है?मैक्रोज़ में मैक्रोज़

कुछ की तरह:

#define Something\ 
#ifdef SomethingElse\ //do stuff \ 
#endif\ 

मैंने कोशिश की और यह काम नहीं किया तो मेरा अनुमान है, यह काम नहीं करता है जब तक कि वहाँ है कि यह ठीक कर सकते हैं वाक्य रचना के कुछ प्रकार है?

उत्तर

11

नहीं, लेकिन आप बस इस #ifdef उच्चस्तरीय रूप में बाहर खींच, और #ifdef की सच्ची और झूठी शाखाओं के लिए दो अलग-अलग #define Something ... संस्करणों का उपयोग करके refactor कर सकते हैं।

15

मैक्रोज़, हाँ। प्रीप्रोसेसर निर्देशों, जो कर रहे हैं आप क्या पोस्ट, कोई

2

नहीं, मैं इस c++ macros with memory?

आप का निरीक्षण या preprocessing वातावरण को बदलने के लिए चाहते हैं में उत्तर दिया, दूसरे शब्दों में एक स्ट्रिंग बदलने के बजाय एक पूर्व प्रसंस्करण सबरूटीन परिभाषित करने के लिए मैक्रो, आपको हेडर का उपयोग करने की आवश्यकता है, हालांकि ऐसा करने के वैध कारण कुछ और बहुत दूर हैं।

4

आप मैक्रो में पूर्वप्रक्रमक निर्देशों उपयोग नहीं कर सकते, लेकिन हम अगर SomethingElse परिभाषित किया गया है की जाँच करें और एक अलग मैक्रो कॉल करने के लिए चाहते हैं, तो आप इसे हासिल कर इस (एक c99 पूर्वप्रक्रमक और Boost.Preprocessor पुस्तकालय की आवश्यकता है) की तरह:

#define PP_CHECK_N(x, n, ...) n 
#define PP_CHECK(...) PP_CHECK_N(__VA_ARGS__, 0,) 

//If we define SomethingElse, it has to be define like this 
#define SomethingElse ~, 1, 

#define Something \ 
BOOST_PP_IF(PP_CHECK(SomethingElse), MACRO1, MACRO2) 

SomethingElse परिभाषित किया गया है यदि यह MACRO1 फोन करेगा, अन्यथा यह MACRO2 कॉल करेंगे। इस कार्य के लिए, SomethingElse इस तरह परिभाषित किया जाना है: http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement

:

#define SomethingElse ~, 1, 

वैसे, यह उनकी संकलक में एक बग की वजह से दृश्य स्टूडियो में काम नहीं करेगा,, यहाँ एक समाधान नहीं है

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