2008-11-03 13 views
27

मैं जीसीसी के संस्करण के आधार पर एक अलग फ़ाइल शामिल करना चाहता हूं। अधिक सटीक मैं लिखना चाहता हूं:मैं जीसीसी के वर्तमान संस्करण संकलित समय पर परीक्षण कैसे करूं?

#if GCC_VERSION >= 4.2 
# include <unordered_map> 
# define EXT std 
#elif GCC_VERSION >= 4 
# include <tr1/unordered_map> 
# define EXT std 
#else 
# include <ext/hash_map> 
# define unordered_map __gnu_cxx::hash_map 
# define EXT __gnu_cxx 
#endif 

मुझे 3.2 से पहले जीसीसी की परवाह नहीं है।

नोट: मुझे यकीन है कि इसके लिए प्रीप्रोकैसिंग समय पर एक चर परिभाषित किया गया है, मैं इसे फिर से नहीं ढूंढ सकता।

उत्तर

26

ठीक है, और अधिक खोजों के बाद, यह __GNUC_PREREQ का उपयोग कर features.h में परिभाषित करने का एक संभावित तरीका है।

#ifdef __GNUC__ 
# include <features.h> 
# if __GNUC_PREREQ(4,0) 
//  If gcc_version >= 4.0 
# elif __GNUC_PREREQ(3,2) 
//  If gcc_version >= 3.2 
# else 
//  Else 
# endif 
#else 
// If not gcc 
#endif 
+2

दुर्भाग्य से इस कोड के साथ विफल रहता है क्लैंग कंपाइलर, जो '__GNUC__' को परिभाषित करता है, लेकिन इसमें 'features.h' शामिल नहीं है। – Gil

+0

ठीक है, यह कोड जीसीसी के संस्करण को जानना है, इसलिए यह आश्चर्य की बात नहीं है कि अगर क्लैंग आंशिक रूप से जीसीसी का प्रतिरूपण करता है तो यह विफल हो जाता है। – PierreBdR

+2

क्षमा करें, ऐसा लगता है कि मैं गलत था। 'Features.h' में बस एक लिनक्स विशिष्ट चीज शामिल है, और किसी भी कोड के लिए भरोसा नहीं किया जाना चाहिए जिसका उद्देश्य अन्य प्लेटफॉर्म पर संकलित करना है। – Gil

41

कि अपनी आवश्यकताओं के लिए परिभाषित किया जाना चाहिए मैक्रो की एक संख्या हैं:

__GNUC__    // major 
__GNUC_MINOR__  // minor 
__GNUC_PATCHLEVEL__ // patch 

संस्करण स्वरूप है major.minor.patch, उदा 4.0.2

इनके लिए प्रलेखन here पाया जा सकता है।

16

एक तरफ ध्यान दें के रूप में:

सभी पूर्व-निर्धारित मैक्रो ढूंढने के लिए:

  • बनाएं खाली फ़ाइल t.cpp
  • g++ -E -dM t.cpp
+15

एक खाली फ़ाइल बनाने के बिना: g ++ -E -dM - JesperE

+0

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। –

+0

@LawrenceAiello: आपकी टिप्पणी केवल 7 साल देर हो चुकी है। –

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