2011-01-05 14 views
101

मैं एक क्रॉस-प्लेटफ़ॉर्म कोड लिख रहा हूं, जिसे लिनक्स, विंडोज़, मैक ओएस पर संकलित करना चाहिए। विंडोज़ पर, मुझे विजुअल स्टूडियो और मिंगव का समर्थन करना होगा।प्रीप्रोसेसर मैक्रोज़ से प्लेटफार्म/कंपाइलर की पहचान कैसे करें?

प्लेटफ़ॉर्म-विशिष्ट कोड के कुछ टुकड़े हैं, जिन्हें मुझे #ifdef .. #endif वातावरण में रखना चाहिए। उदाहरण के लिए, यहां मैंने Win32 विशिष्ट कोड रखा:

#ifdef WIN32 
#include <windows.h> 
#endif 

लेकिन मैं लिनक्स और मैक ओएस को कैसे पहचानूं? नाम (या आदि) को परिभाषित करने के लिए मुझे क्या उपयोग करना चाहिए?

+0

डुप्ले का एक बेहतर स्वीकार्य उत्तर है। – rubenvb

+1

सुझाया गया डुप्लिकेट एक ही प्रश्न नहीं है। वह प्रश्न केवल ऑपरेटिंग सिस्टम की पहचान करने के बारे में पूछता है, जबकि यह प्रश्न संकलक की पहचान करने के बारे में भी पूछता है, जो कि एक बहुत ही अलग बात है। – JBentley

+3

यहां [ओएस मैक्रो परिभाषित सूची] है (http://sourceforge.net/p/predef/wiki/OperatingSystems/)। – OCaml

उत्तर

114

लिए मैक ओएस:

#ifdef __APPLE__ 

विंडोज पर Mingw के लिए:

#ifdef __MINGW32__ 

के लिए लिनक्स:

#ifdef __linux__ 

अन्य के लिए विंडोज कंपाइलर्स, कई अन्य कंपाइलर्स और आर्किटेक्चर के लिए this thread और this देखें।

+2

क्या '__APPLE__' ओएसएक्स और आईओएस के बीच अंतर करता है? – gman

+13

'__APPLE__' ओएस एक्स और आईओएस दोनों के लिए सेट है। आप '#ifdef __APPLE__' के अंदर' targetConditionals.h> 'शामिल कर सकते हैं, जो तब आपको 'TARGET_OS_IPHONE # परिभाषित करता है'। –

+2

'__MINGW64__', लगता है' विंडोज़/MSVC के लिए _MSC_VER' एक उल्लेख (जो भी MSVC संस्करण की जाँच करने के लिए इस्तेमाल किया जा सकता है) के लायक है जब एक mingw64 – scones

58

देखें: http://predef.sourceforge.net/index.php

इस परियोजना के कई ऑपरेटिंग सिस्टम, compilers, भाषा और मंच मानकों, और मानक पुस्तकालयों के लिए पूर्व निर्धारित #defines की एक यथोचित व्यापक सूची प्रदान करता है।

+5

संस्करण 1.55 के रूप में, प्रिडफ अब [बूस्ट सी ++ लाइब्रेरीज़] (http://www.boost.org/) में शामिल है। – rvalue

+0

मुझे पता है कि जब आप इसे पोस्ट करते हैं तो नियम अलग थे, लेकिन मुझे आपको अधिक प्रासंगिक विवरण शामिल करने के लिए इस पोस्ट को संपादित करने के लिए कहा जाना है। अब एक दिन लिंक केवल जवाब दृढ़ता से निराश हैं, और मैं आपको इस पोस्ट को हटाने से पहले सहेजने का मौका देना चाहता हूं। –

+1

चूंकि यह एकमात्र उत्तर है जो वास्तव में शीर्षक में बताए गए प्रश्न का उत्तर देता है, और सवाल बहुत सामान्य और प्रासंगिक है, मैं इसे हटाने के खिलाफ दृढ़ता से सलाह देता हूं। मैं इसे "केवल लिंक" उत्तर नहीं कहूंगा। – hobb

41

यहाँ मैं क्या उपयोग है:

#ifdef _WIN32 // note the underscore: without it, it's not msdn official! 
    // Windows (x64 and x86) 
#elif __unix__ // all unices, not all compilers 
    // Unix 
#elif __linux__ 
    // linux 
#elif __APPLE__ 
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though... 
#endif 

संपादित करें: हालांकि उपरोक्त मूल बातें के लिए काम कर सकते हैं, क्या मैक्रो आप Boost.Predef reference pages को देखकर के लिए जाँच करना चाहते हैं सत्यापित करने के लिए याद है। या बस Boost.Predef का उपयोग सीधे करें।

+3

उपयोग __linux __ बजाय, लिनक्स परिभाषित नहीं है जब अक्षम जीएनयू एक्सटेंशन के साथ जीसीसी के साथ संकलन (यानी -std = C++ 0x) – Erbureth

+1

@Erbureth फिक्स्ड, लेकिन एक सच में predef.sourceforge.net/index.php में के रूप में इस्तेमाल करना चाहिए उच्चतम रेटेड उत्तर। – rubenvb

+0

@ रूबेनव: वास्तव में। और मुझे अभी भी बहुत कम वोट मिले हैं, मुझे लगता है :) ... मैं अपनी साइट पर कई बार बदल गया हूं। – 0xC0000022L

19

यदि आप सी ++ लिख रहे हैं, तो मैं Boost लाइब्रेरी का पर्याप्त उपयोग करने की अनुशंसा नहीं कर सकता।

नवीनतम संस्करण (1.55) में एक नई Predef लाइब्रेरी शामिल है जो exactly what you're looking for को कवर करती है, साथ ही दर्जनों अन्य प्लेटफॉर्म और आर्किटेक्चर मान्यता मैक्रोज़ के साथ।

#include <boost/predef.h> 

// ... 

#if BOOST_OS_WINDOWS 

#elif BOOST_OS_LINUX 

#elif BOOST_OS_MACOS 

#endif 
+0

यह देखते हुए कि यह बढ़ावा है, यह समाधान विभिन्न प्लेटफार्मों/ओएस और विभिन्न कंपाइलरों पर काम करेगा। –

+1

* "मैं बूस्ट पुस्तकालयों का पर्याप्त रूप से पर्याप्त उपयोग करने की अनुशंसा नहीं कर सकता ...." * - मैंने तीन बार बूस्ट का मूल्यांकन किया है। यह मूल्यांकन पास नहीं कर सकता है ... अगर वे स्वीकार किए जाते हैं तो अधिकांश बग रिपोर्ट भाग्यशाली थीं। इंजीनियरिंग प्रक्रिया में गहरी समस्याओं के लिए स्वीकृति अंक की कमी। मेरा मानना ​​है कि प्रीप्रोसेसर मैक्रोज़ और सी ++ मानक पुस्तकालयों में निर्मित एक सुरक्षित विकल्प है। – jww

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