प्रीप्रोसेसर मैक्रोज़ से प्लेटफ़ॉर्म / कंपाइलर की पहचान कैसे करें?


115

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

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

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

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



दुपट्टे का ज्यादा बेहतर जवाब है।
रुबनेव

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

@JBentley ने अभी तक स्वीकार किए गए उत्तर में संकलक का उल्लेख नहीं किया है, और केवल OSes (और एक "प्लेटफ़ॉर्म") के बारे में बात करता है। यह उल्लेख करने के लिए नहीं है कि यह एक भयानक जवाब है जो डुप्ले को पेश करना है।
रुबेंव

1
@rubenvb फिर अन्य प्रश्न को टिप्पणी के रूप में लिंक करें। सिर्फ इसलिए कि इसका एक बेहतर उत्तर है, इसे डुप्लिकेट नहीं बनाते हैं। सवाल यह है कि क्या यह निर्धारित करता है कि यह एक डुप्लिकेट है, उत्तर नहीं। इसे बंद करना केवल यह सुनिश्चित करता है कि हमें प्रश्न के संकलक से संबंधित भाग के लिए एक अच्छी गुणवत्ता वाला उत्तर कभी नहीं मिलेगा, जिसे तथाकथित "डुप्लिकेट" कभी भी जवाब नहीं दे सकता है।
जेन्बले

जवाबों:


133

के लिए मैक ओएस :

#ifdef __APPLE__

Windows पर MingW के लिए :

#ifdef __MINGW32__

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

#ifdef __linux__

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


2
__APPLE__OSX और iOS के बीच अंतर करता है ?
gman

14
__APPLE__OS X और iOS दोनों के लिए सेट है। आप #include <TargetConditionals.h>अंदर हो सकते हैं #ifdef __APPLE__, जो तब आपको एक देता है TARGET_OS_IPHONE #define
टेड माइल्सेरेके

2
__MINGW64__भी उपलब्ध है जब एक का उपयोग करता है mingw64 है
scones

2
चूंकि __MINGW64__संदर्भित है, _MSC_VERविंडोज / MSVC के लिए सोचें एक उल्लेख के लायक है (जिसका उपयोग MSVC संस्करण की जांच के लिए भी किया जा सकता है)।
विचारमेन .42

मुझे खेद है, लेकिन यह जवाब सभी खातों पर काफी गलत है और इस सवाल का जवाब भी नहीं देता है।
रबनेव

59

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

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


5
संस्करण १.५५ के रूप में, प्रिफ अब बूस्ट सी ++ लाइब्रेरी में शामिल है ।
rvalue

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

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

2
@ 0x7fffffff: किसी को भी इस में अन्य उत्तरों की सामग्री को डुप्लिकेट करने में क्या संभव लाभ होगा? यदि आप मानते हैं कि एक एकल निश्चित उत्तर होना वास्तव में महत्वपूर्ण है, तो शायद आपको खुद ही ऐसा उत्तर बनाना चाहिए (यह कठिन नहीं होना चाहिए: बस कुछ जवाबों को कुछ समझदार क्रम में एक साथ गोंद करना चाहिए)। व्यक्तिगत रूप से मेरे पास मेरे समय के साथ करने के लिए बेहतर चीजें हैं, लेकिन एक मॉडरेटर के रूप में स्पष्ट रूप से एसओ मेरे लिए आपके लिए अधिक महत्वपूर्ण है।
जॉन बार्थोलोम्यू

47

यहाँ मेरा उपयोग है:

#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

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


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

1
@Erbureth फिक्स्ड, लेकिन किसी को वास्तव में सबसे अधिक जवाब देने के रूप में predef.sourceforge.net/index.php का उपयोग करना चाहिए।
रुबेंव

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

संगति के लिए (शायद थोड़ा पांडित्य): पहला #ifअगर परिभाषित किया जाए, तो दूसरे मूल्य के लिए परीक्षण करते हैं। अगर ऐसा करने के लिए और अधिक सुसंगत होगा #elif defined(__unix__) , मुझे लगता है।
leonbloy

20

यदि आप C ++ लिख रहे हैं, तो मैं बूस्ट पुस्तकालयों का दृढ़ता से उपयोग करने की अनुशंसा नहीं कर सकता ।

नवीनतम संस्करण (1.55) में एक नया पूर्वनिर्धारित पुस्तकालय शामिल है जो ठीक उसी तरह से शामिल है जो आप देख रहे हैं , साथ ही दर्जनों अन्य मंच और वास्तुकला मान्यता मैक्रोज़।

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif

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

3
"मैं बूस्ट पुस्तकालयों का दृढ़ता से उपयोग करने की अनुशंसा नहीं कर सकता ...." - मैंने तीन बार बूस्ट का मूल्यांकन किया है। यह एक मूल्यांकन पारित नहीं कर सकता है ... अधिकांश बग रिपोर्ट भाग्यशाली थीं यदि उन्हें स्वीकार किया गया था। पावती की कमी इंजीनियरिंग प्रक्रिया में गहरी समस्याओं की ओर इशारा करती है। मेरा मानना ​​है कि प्रीप्रोसेसर मैक्रोज़ और सी ++ में निर्मित स्टैंडर्ड लाइब्रेरी एक सुरक्षित विकल्प हैं।
3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.