2011-03-21 16 views
80

मुझे हाल ही में कुछ कोड का सामना करना पड़ा है कि जीसीसी इस तर्क के बिना संकलित नहीं होगा। मैंने जीसीसी मैन पेज की जांच की, लेकिन मुझे यह विशिष्ट विकल्प नहीं मिला। मुझे XOPEN_SOURCE मिला, लेकिन यह क्या करता है इसके बारे में थोड़ा सा स्पष्टीकरण था।-D_XOPEN_SOURCE क्या करता है/मतलब है?

क्या कोई विस्तृत कर सकता है? मुझे पता है -D_XOPEN_SOURCE विभिन्न मानों पर सेट किया जा सकता है, जैसे 400, 600, लेकिन वे क्या करते हैं?

उत्तर

105

जब आप ऐसा करेंगे

#define _XOPEN_SOURCE <some number> 

या

cc -D_XOPEN_SOURCE=<some number> 

यह आपके संकलक बताता है कुछ अतिरिक्त फ़ंक्शन कि X/ओपन और POSIX मानकों में परिभाषित कर रहे हैं के लिए परिभाषाओं में शामिल करने के लिए।

यह आपको कुछ अतिरिक्त कार्यक्षमता देगा जो हाल ही में यूनिक्स/बीएसडी/लिनक्स सिस्टम पर मौजूद है, लेकिन शायद विंडोज़ जैसे अन्य सिस्टम पर मौजूद नहीं है।

संख्याएं मानक के विभिन्न संस्करणों को संदर्भित करती हैं।

आप बता सकते हैं, जो एक आप (यदि हो तो) की जरूरत है प्रत्येक कार्य आप कॉल के लिए आदमी पृष्ठ देख कर।

उदाहरण के लिए, man strdup का कहना है:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)): 

     strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 
     strndup(), strdupa(), strndupa(): _GNU_SOURCE 

जिसका मतलब है कि आप इनमें से किसी एक रखना चाहिए: किसी भी #include रों करने से पहले अपने स्रोत फ़ाइल के शीर्ष पर

#define _SVID_SOURCE 
#define _BSD_SOURCE 
#define _XOPEN_SOURCE 500 
#define _XOPEN_SOURCE 600 
#define _XOPEN_SOURCE 700 

यदि आप चाहते हैं strdup का उपयोग करें।

या आप

#define _GNU_SOURCE 
वहाँ

बजाय, जो नकारात्मक पक्ष यह है कि यह सोलारिस, FreeBSD, मैक ओएस एक्स पर संकलन नहीं हो सकता है के साथ सभी कार्यक्षमता सक्षम बनाता है,, डाल सकता है आदि

यह एक अच्छा विचार है #include, #define, या एक नया फ़ंक्शन का उपयोग करने से पहले प्रत्येक व्यक्ति पृष्ठ को जांचने के लिए, क्योंकि कभी-कभी उनका व्यवहार बदलता है और #define आपके पास क्या है, उदाहरण के लिए basename(3)

यह भी देखें:

+1

इन भाषा-बोलीभाषा परिभाषाओं के लिए "आपकी स्रोत फ़ाइल के शीर्ष पर" कितना महत्वपूर्ण है, अंडरस्कोर करने के लिए बस एक टिप्पणी है। अगर वे बहुत ऊपर नहीं हैं, तो वे काम नहीं करते हैं। –

3

यह पॉज़िक्स जैसे दिए गए मानदंड की परिभाषा से संबंधित शीर्षलेख का खुलासा करता है। वास्तविक मानदंड से संबंधित यह मान द्वारा परिभाषित किया गया है (उदाहरण के लिए यहां 400 या 600)। मानक/मूल्य बाध्यकारी के लिए यह Reference देखें।

7

-D एक प्रोप्रोसेसर चर परिभाषित करने के लिए एक सी संकलक विकल्प है। इस मामले में _XOPEN_SOURCE

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

उनमें से एक को परिभाषित करना कभी-कभी आवश्यक होता है, क्योंकि कुछ मानक कार्यों या यहां तक ​​कि उनके हस्ताक्षर का व्यवहार मानकों के बीच भिन्न हो सकता है। तो आपको -D_XOPEN_SOURCE या किसी संगतता मोड को चालू करने के समान कुछ उपयोग करना पड़ सकता है।

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

0

किसी अज्ञात reaso के लिए एन, मैक ओएस/एक्स (एक्सकोड) को स्ट्रडअप() को परिभाषित करने के लिए 600 की आवश्यकता है, भले ही यह 1995 के विनिर्देशन में है। मोज़िला और others इस में भाग गए हैं ...

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