2009-07-25 2 views
5

में फ़ाइलों को शामिल करने के संकलन-समय अस्तित्व का निर्धारण करें, मैं कुछ पोर्टेबल सी ++ लाइब्रेरी कोड लिखने की कोशिश कर रहा हूं जो प्रारंभ में बूस्ट.रेगेक्स पर निर्भर करेगा, और उसके बाद टीआर 1 पर जाएं क्योंकि कंपेलर इसका समर्थन करते हैं, और अंत में सी ++ 0x विनिर्देशों को std :: tr1 नेमस्पेस से std में स्थानांतरित करने के बाद। यहाँ मैं पूर्वप्रक्रमक के साथ क्या करना चाहते हैं, उसके लिए कुछ छद्म कोड है:सी ++

if(exists(regex)) // check if I can #include <regex> 
{ 
    #include <regex> // per TR1 
    if(is_namespace(std::tr1)) // are we on TR1 or C++0x? 
    { 
     using std::tr1::regex; 
    } else 
    { 
     using std::regex; 
    } 
} else // fall-back to boost 
{ 
    #include <boost/regex.hpp> 
    using boost::regex; 
} 

दी, यह सब पूर्वप्रक्रमक निर्देशों में अवश्य होना चाहिए कि, लेकिन अगर मुझे पता था कि कैसे पूरा करने के लिए है कि मैं नहीं होगा यहाँ पूछो :)

उत्तर

10

आप प्रीप्रोकैसिंग से पहले किसी तीसरे पक्ष की चीज़ पर भरोसा किए बिना ऐसा नहीं कर सकते हैं। आम तौर पर, इसे पूरा करने के लिए autoconf जैसी चीजें का उपयोग किया जा सकता है।

वे #define निर्देशों के साथ एक अन्य शीर्षलेख फ़ाइल उत्पन्न करके काम करते हैं जो हेडर/पुस्तकालयों का अस्तित्व दर्शाते हैं जो आप उपयोग करना चाहते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद! :) – Zac

6

आप इसे नहीं कर सकते हैं। सी ++ का प्रीप्रोसेसिंग चरण संकलन चरण से पहले होता है, इसलिए सी ++ भाषा सशर्त संरचनाओं को उपयोगी रूप से प्रीकॉसर के निर्देशों जैसे # शामिल नहीं किया जा सकता है।

यदि आपको सशर्त संकलन की आवश्यकता है, तो इसे करने का तरीका #ifdef का उपयोग करना है। की तरह कुछ:

#ifdef BOOST_BUILD 
    #include "somebooststuff.h" 
    using namespace boost; 
#else 
    #include "somestdstuff.h" 
    using namespace std; 
#endif 

जहां BOOST_BUILD एक पूर्वप्रक्रमक प्रतीक आप अपने makefile या जो कुछ भी में परिभाषित है।

+0

होगा मैक्रो सी ++ संकलित सशर्त संरचनाओं का उपयोग करने की कोशिश कर रहा हूँ। अधिक विशेष रूप से, मैं #ifdef निर्देश के समान कुछ ढूंढ रहा हूं जिसमें फ़ाइल शामिल है या नहीं, यह जांचने की कार्यक्षमता है: #ifexists (या उस प्रभाव के लिए कुछ) – Zac

+3

ऐसी कोई प्रीप्रोसेसर कार्यक्षमता नहीं है। यदि आपको वास्तव में ऐसा करने की ज़रूरत है 9 और मुझे संदेह है कि आप ऐसा करते हैं) आपको इसे संकलित करने से पहले पर्ल या पायथन जैसी किसी चीज़ में लिखी गई किसी भी प्रकार की टेक्स्ट प्रोसेसिंग स्क्रिप्ट के माध्यम से अपना कोड चलाने की आवश्यकता है। –

3

आप उपयोग कर सकते हैं __cplusplus सी के किस संस्करण को देखने के लिए ++ आप साथ काम कर रहे अगले मानक (सी ++ 1x, C++0x isn't meant to be) में मैं विशेष रूप से कहा कि मैं wasn 'यह a value larger than 199711L

#if __cplusplus > 199711 
    using std::regex; 
#else 
    using std::tr1::regex; 
#endif