-D_XOPEN_SOURCE क्या करता / करती है?


103

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

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

जवाबों:


132

जब तुम करोगे

#define _XOPEN_SOURCE <some number>

या

cc -D_XOPEN_SOURCE=<some number>

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

यह आपको कुछ अतिरिक्त कार्यक्षमता देगा जो अधिकांश हाल ही में UNIX / BSD / Linux सिस्टम पर मौजूद है, लेकिन संभवतः विंडोज जैसे अन्य सिस्टम पर मौजूद नहीं है।

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

आप बता सकते हैं कि आपके द्वारा कॉल किए जाने वाले प्रत्येक फ़ंक्शन के मैन पेज को देखकर आपको किसकी (यदि कोई है) जरूरत है।

उदाहरण के लिए, 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

जिसका अर्थ है कि आपको इनमें से एक को रखना चाहिए:

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

#includeयदि आप उपयोग करना चाहते हैं तो किसी भी एस करने से पहले अपने स्रोत फ़ाइल के शीर्ष पर strdup

या आप डाल सकते हैं

#define _GNU_SOURCE

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

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

यह सभी देखें:


4
इन भाषा-बोली को परिभाषित करने के लिए "आपकी स्रोत फ़ाइल के शीर्ष पर" कितना महत्वपूर्ण है, यह रेखांकित करने के लिए बस एक टिप्पणी। यदि वे बहुत ऊपर नहीं हैं, तो वे काम नहीं करते हैं।
डॉ। पर्सन II II

6

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

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

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

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


3

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


1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.