2015-05-15 7 views
5

मैं जो विभिन्न पुस्तकालयों में एक ही नाम है विभिन्न पूर्वप्रक्रमक चर है। सभी स्टोर करने के लिए एक स्वचालित तरीका नहीं हैबचें परिभाषा पूर्वप्रक्रमक चर

#ifdef VAR 
#define TEMPVAR VAR 
#undef VAR 
#endif 

#include "conflictingheader.hh" 

#ifdef VAR 
#undef VAR 
#endif 

#ifdef TEMPVAR 
#define VAR TEMPVAR 
#undef TEMPVAR 
#endif 

:

आदेश टकराव से बचने के लिए, मैं क्या कर रहा हूँ (उदाहरण में है सादगी के लिए शामिल करने के लिए केवल 1 परस्पर विरोधी चर और 1 हेडर) है विरोधाभासी चर, उन्हें परिभाषित और बाद में उन्हें बहाल?

या यह आपरेशन के इन सेट प्रदर्शन करने के लिए एक मैक्रो परिभाषित करना संभव है?

+2

अपने प्रीप्रोसेसर आइटमों का नाम देना संभव है जैसे अन्य मॉड्यूल उन पर कदम नहीं उठाएंगे (सम्मेलन द्वारा, प्रवर्तन नहीं)। मेरा मानना ​​है कि आप जो मांग रहे हैं वह संभव नहीं है। – mah

उत्तर

7

C++ भाषा पूर्वप्रक्रमक मैक्रो से निपटने के लिए बचाने के लिए और बहाल एक स्वचालित तरीका उपलब्ध नहीं कराता। प्रीप्रोसेसर मैक्रो (कि संकलक या संकलक कमांड लाइन से परिभाषित नहीं कर रहे हैं) एक फ़ाइल वैश्विक स्तर पर काम करते हैं, और वहाँ एक विशेष हैडर कि किया जा रहा है #include घ के लिए एक मैक्रो के दायरे को सीमित का बोध भी नहीं है।

तरह से मैं इस तरह के एक मुद्दे से निपटने के हैं एक नया हेडर फाइल है कि कार्यक्षमता मुझे लगता है कि विशेष रूप से पुस्तकालय से जरूरत के लिए इंटरफ़ेस रैपर प्रदान करता है बनाने के लिए, लेकिन किसी भी मैक्रो निर्भरता के बिना है। फिर एक स्रोत फ़ाइल में रैपर को कार्यान्वित करें जिसमें केवल उस परेशानी वाले हेडर फ़ाइल को शामिल किया गया हो।


आपका संकलक काम थोड़ा कम वर्बोज़ बनाने के लिए एक विस्तार प्रदान कर सकता है, लेकिन पूरी तरह से जिस तरह से है कि मैं समझता हूँ कि आप का मतलब करने के लिए स्वचालित नहीं।

जीसीसी और माइक्रोसॉफ्ट compilers समर्थन धक्का और स्थूल pragmas पॉप।

माइक्रोसॉफ्ट विंडोज compilers के साथ संगतता के लिए, जीसीसी #pragma push_macro("macro_name") और #pragma pop_macro("macro_name") का समर्थन करता है।

#pragma push_macro("macro_name")
यह pragma इस मैक्रो के लिए ढेर के शीर्ष करने के macro_name के रूप में नामित मैक्रो का मूल्य बचाता है।

#pragma pop_macro("macro_name")
यह pragma इस मैक्रो के लिए ढेर के शीर्ष पर मूल्य को macro_name के रूप में नामित मैक्रो का मूल्य निर्धारित करता है। यदि macro_name के लिए ढेर खाली है, तो मैक्रो का मान अपरिवर्तित बनी हुई है।

GCC documentation

+0

लेकिन फिर मैं wrapper.hh शामिल करूंगा जिसमें कार्यान्वयन wrapper.cc शामिल होगा जिसमें विरोधाभासी शीर्षलेख शामिल होगा। इसलिए अंत में मेरी फ़ाइल में विरोधाभासी शीर्षलेख शामिल होगा। एचएच। क्या मैं कुछ भूल रहा हूँ? –

+2

शीर्षलेख फ़ाइलों में स्रोत फ़ाइलों को शामिल नहीं करना चाहिए। – jxh

0

यह करने के लिए कोई मानक तरीका नहीं है। @jxh का एक अच्छा गैर-मानक तरीका है। कारण यह काम नहीं करता है कि मैक्रोज़ का मूल्यांकन तब तक नहीं किया जाता जब तक उनका विस्तार नहीं किया जाता है, तब उनका मूल्यांकन नहीं किया जाता है जब किसी अन्य मैक्रो परिभाषा में उपयोग किया जाता है।

#define MY_MACRO VAR 

#define MY_STR_MACRO2(M) # M 
#define MY_STR_MACRO(M) "MY_MACRO = " MY_STR_MACRO2(M) "\n" 

    printf(MY_STR_MACRO(MY_MACRO)); //writes "VAR" 

#define VAR 4 
    printf(MY_STR_MACRO(MY_MACRO)); //writes "4" 

#undef VAR 
    printf(MY_STR_MACRO(MY_MACRO)); //writes "VAR" again 

प्रत्येक printf लाइन पर, यह MY_MACRO को देखता है और देखता है कि यह "वीएआर" है और फिर अगर VAR कुछ भी करने के लिए परिभाषित किया गया है को देखने के लिए लग रहा है। कभी-कभी यह होता है, कभी-कभी यह नहीं होता है।

तो आप इस प्रयास करते हुए:

#define TEMPVAR VAR 

केवल बात यह है कि TEMPVAR में कब्जा कर लिया है "वीएआर" कुछ भी है कि VAR इस बिंदु पर विचार नहीं किया है के रूप में मूल्यांकित हो सकता है और जब तक यह करने के लिए है नहीं होगा है TEMPVAR का मूल्यांकन करें।

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