2011-02-07 21 views
5

यह कुछ इस तरह करने के लिए संभव है:मैक्रो निर्भर मैक्रो

#define F(x) \ 
    #ifdef DOUBLE \ 
     2*x \ 
    #else \ 
     x \ 
    #endif 

इतनी है कि जब मैं F उपयोग करते हैं, क्या यह करने के लिए फैलता है कि क्या मैक्रो DOUBLE पर निर्भर करता है परिभाषित किया गया है? मुझे ऐसा नहीं लगता, लेकिन मुझे उम्मीद है। जीएनयू विस्तार ठीक है।

संपादित कुछ उत्तर के जवाब में, मैं वास्तव में इस का उपयोग कर रहा कुछ कोड पीढ़ी है, जहां कोड जहां यह परिभाषित हो जाता है पर निर्भर करता है थोड़ा अलग है क्या करना है। जिस क्रम में कुछ फाइलें शामिल की गई हैं और जहां प्रासंगिक मैक्रोज़ को परिभाषित करने की आवश्यकता है, इस तरह से इसे स्विच करने के लिए थोड़ा सा फैक्टरिंग की आवश्यकता होती है। मुझे ऐसा करना पड़ सकता है, लेकिन अगर मुझे इस कोने से खुद को अनचाहे नहीं करना पड़ेगा तो रोमांचित होगा!

उत्तर

8

हम इस समस्या को विवश कर सकते हैं, तो आप ऐसा कर सकते हैं। विशेष रूप से, अगर आपको लगता है कि गारंटी ले सकते हैं DOUBLE है या तो

  • मैक्रो के रूप में परिभाषित नहीं किया, या
  • , ऐसा मैक्रो एक खाली टोकन अनुक्रम (#define DOUBLE जैसे) के लिए विस्तारित रूप में परिभाषित किया गया है

तो

#define F_IMPL_(x)  DOUBLE_IS_DEFINED 
#define F_IMPL_DOUBLE(x) DOUBLE_NOT_DEFINED 

#define F_1(x, m) F_2(x, m) 
#define F_2(x, m) F_IMPL_ ## m (x) 

#define F(x) F_1(x, DOUBLE) 

प्रयोग उदाहरण: आप टोकन संयोजन के साथ एक अप्रत्यक्ष दृष्टिकोण का उपयोग कर सकते हैं

पूर्व प्रसंस्करण के बाद
F(t) 
#define DOUBLE 
F(t) 

परिणाम:

DOUBLE_NOT_DEFINED 
DOUBLE_IS_DEFINED 

यह दृष्टिकोण भी अगर उस टोकन का भाग बन सकती है, अगर DOUBLE (अगर यह परिभाषित किया गया है) एक मैक्रो है कि एक ही ज्ञात टोकन के लिए विस्तारित रूप में परिभाषित किया गया है काम करेंगे एक पहचानकर्ता (उदाहरण के लिए, TRUE या 1)। इसे संभालने के लिए, आपको बस F_IMPL_ मैक्रो का नाम F_IMPL_{TOKEN} (उदा।, F_IMPL_TRUE या F_IMPL_1) का नाम बदलना होगा।

+0

यह सही है। –

+0

अच्छी नौकरी। हालांकि मैं इसे बनाए रखने से नफरत करता हूं। – AShelly

13

क्या

#ifdef DOUBLE 
    #define F(x) (2 * (x)) 
#else 
    #define F(x) (x) 
#endif 
4

साथ कुछ गड़बड़ है दूसरी तरह के आसपास घोंसला बनाने से क्यों नहीं?

#ifdef DOUBLE 
#define F(x) (2*(x)) 
#else 
#define F(x) (x) 
#endif 
3

सं निकटतम बात आप कर सकते हैं डाल दिया है कि एक हेडर फाइल में, और कहा कि हेडर फाइल हर बार परिभाषाओं आप परिवर्तन के बारे में परवाह # शामिल है। इसे कभी-कभी "एक्स" पैटर्न कहा जाता है, क्योंकि X को मैक्रो के रूप में उपयोग किया जाता है जो परिभाषा को बदलता है।

उदाहरण के लिए, उस पैटर्न में से एक आम उपयोग enum मूल्यों की स्ट्रिंग नाम autogenerate के लिए है:

// File myenum_values.h 
// NOTE: _no_ header guards so we can include this file multiple times 
X(Apple) 
X(Orange) 
X(banana) 

// File myenum.h 
enum Fruit 
{ 
#define X(x) x, 
#include "myenum_values.h" 
} 

const char *FruitNames[] = 
{ 
#undef X 
#define X(x) #x, 
#include "myenum_values.h" 
}; 

// We now have an array of fruit names without having to define the enum twice