"# अल्पाइन _GNU_SOURCE" का क्या अर्थ है?


152

आज मुझे basename()फंक्शन का उपयोग करना था , और यहाँman 3 basename ( यहाँ ) ने मुझे कुछ अजीब संदेश दिया:

टिप्पणियाँ

बेसनेम के दो अलग-अलग संस्करण हैं () - ऊपर वर्णित POSIX संस्करण, और GNU संस्करण , जो एक के बाद मिलता है

#define _GNU_SOURCE
#include <string.h>

मैं सोच रहा हूँ कि इस #define _GNU_SOURCEका अर्थ है: यह है tainting एक जीएनयू से संबंधित लाइसेंस के साथ कोड मैं लिखने? या यह केवल संकलक को " वेल, मुझे पता है, जैसे कुछ बताने के लिए उपयोग किया जाता है , इस प्रकार का कार्य POSIX नहीं है, इस प्रकार पोर्टेबल नहीं है, लेकिन मैं इसे वैसे भी उपयोग करना चाहता हूं "।

यदि ऐसा है, तो लोगों को अलग-अलग हेडर क्यों नहीं दिए जाते हैं, बजाय एक फ़ंक्शन कार्यान्वयन या दूसरे को प्राप्त करने के लिए कुछ अस्पष्ट मैक्रो को परिभाषित करने के लिए?

कुछ मुझे भी परेशान करता है: संकलक को यह कैसे पता चलता है कि क्रियान्वयन निष्पादन योग्य के साथ जोड़ने के लिए कौन सा कार्य करता है? क्या यह भी इसका उपयोग करता है #define?

किसी ने मुझे देने के लिए कुछ संकेत हैं?

जवाबों:


172

परिभाषित _GNU_SOURCEकरने का लाइसेंस और सब कुछ लिखने के साथ कुछ नहीं करना है (गैर-) पोर्टेबल कोड। यदि आप परिभाषित करते हैं _GNU_SOURCE, तो आपको मिलेगा:

  1. बहुत से गैर-मानक GNU / लिनक्स विस्तार कार्यों तक पहुँच
  2. पारंपरिक कार्यों तक पहुँच जो POSIX मानक से छोड़ी गई थी (अक्सर अच्छे कारण के लिए, जैसे कि बेहतर विकल्प के साथ प्रतिस्थापित किया जाना, या विशेष विरासत कार्यान्वयन से बंधा होना)
  3. निम्न-स्तर के कार्यों तक पहुंच, जो पोर्टेबल नहीं हो सकते हैं, लेकिन आपको कभी-कभी सिस्टम उपयोगिताओं को लागू करने की आवश्यकता होती है mount, जैसे कि ,ifconfig आदि
  4. POSIX- निर्दिष्ट कार्यों के बहुत से टूटे हुए व्यवहार, जहां GNU लोग मानकों की समिति से असहमत हैं कि कार्यों को कैसे करना चाहिए और अपना काम करने का फैसला किया।

जब तक आप इन चीजों के बारे में जानते हैं, तब तक इसे परिभाषित करने की समस्या नहीं होनी चाहिए _GNU_SOURCE, लेकिन आपको इसे परिभाषित करने से बचना चाहिए और इसके बजाय परिभाषित करना चाहिए _POSIX_C_SOURCE=200809Lया_XOPEN_SOURCE=700 जब तक कि आपके कार्यक्रम पोर्टेबल तब संभव होने तक ।

विशेष रूप से, चीजों से _GNU_SOURCE आपको कभी भी उपयोग नहीं करना चाहिए, वे # 2 और # 4 ऊपर हैं।


71
बेशक, हर कोई जानता है कि परिभाषित करने का वास्तविक कारण _GNU_SOURCEपाने के लिए है strfryऔर memfrob
user4815162342

5
जीएनयू सी लाइब्रेरी प्रलेखन के लिए यह लिंक कुछ अतिरिक्त विवरण प्रदान करता है (उदाहरण के लिए, #define _GNU_SOURCE"फ़ाइल में बहुत ही पहली चीज, केवल टिप्पणियों से पहले" होने की सिफारिश की गई है)।
अलेक्जेंडर पॉज़्नवीव

प्रासंगिक नहीं है, लेकिन 32 बिट लक्ष्य पर 2GB फ़ाइल आकार सीमा का विस्तार करने के लिए उपयोग किया जाता है।
मकेन्ज़म

1
@mckenzm: मुझे लगता है कि आप सोच रहे हैं _FILE_OFFSET_BITS, नहीं _GNU_SOURCE
आर .. गिटहब स्टॉप हेल्पिंग ICE

मैं अन्य प्लेटफार्मों और टूल-चेन के लिए स्ट्रैफ्री मेम्ब्रोब और इसी तरह की सुविधाओं के पोर्टिंग के लिए एक भुगतान प्रोग्रामर बनना चाहता हूं ।
मैसिमो

6

मुझे दो और बिंदुओं का जवाब देने दें:

कुछ मुझे भी परेशान करता है: संकलक को यह कैसे पता चलता है कि कार्यान्वयन किस कार्य को निष्पादन योग्य के साथ जोड़ना है? क्या यह इस #define का भी उपयोग करता है?

एक सामान्य दृष्टिकोण अलग-अलग नामों के लिए सशर्त #defineरूप basenameसे पहचानकर्ता है, जो कि _GNU_SOURCEपरिभाषित किया गया है पर निर्भर करता है। उदाहरण के लिए:

#ifdef _GNU_SOURCE
# define basename __basename_gnu
#else
# define basename __basename_nongnu
#endif

अब पुस्तकालय को केवल उन नामों के तहत दोनों व्यवहार प्रदान करने की आवश्यकता है।

यदि ऐसा है, तो एक समारोह कार्यान्वयन या दूसरे को प्राप्त करने के लिए कुछ अस्पष्ट पर्यावरण चर को परिभाषित करने के बजाय लोगों को अलग-अलग हेडर क्यों नहीं दिया जाता है?

अक्सर एक ही हेडर में अलग-अलग यूनिक्स संस्करणों में कुछ अलग सामग्री होती है, इसलिए कहने के लिए एक भी सही सामग्री नहीं है, <string.h>- कई मानक ( xkcd ) हैं। अपने पसंदीदा को चुनने के लिए मैक्रोज़ का एक पूरा सेट है, ताकि यदि आपका कार्यक्रम एक मानक की उम्मीद करता है, तो पुस्तकालय उसी के अनुरूप होगा।


6

सभी के द्वारा सक्षम किए गए सटीक विवरण के लिए _GNU_SOURCE, प्रलेखन मदद कर सकता है।

GNU प्रलेखन से:

मैक्रो: _GNU_SOURCE

यदि आप इस मैक्रो को परिभाषित करते हैं, तो सब कुछ शामिल है: ISO C89, ISO C99, POSIX.1, POSIX.2, BSD, SVID, X / Open, LFS और GNU एक्सटेंशन। ऐसे मामलों में जहां POSIX.1 BSD के साथ टकराव करता है, वहीं POSIX परिभाषाएँ पूर्वता लेती हैं।

फीचर टेस्ट मैक्रोज़ पर लिनक्स मैन पेज से :

_GNU_SOURCE

इस मैक्रो को परिभाषित करना (किसी भी मूल्य के साथ) का अर्थ परिभाषित किया गया है _ATFILE_SOURCE, _LARGEFILE64_SOURCE, _ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED, _OSOSIX_SOURCE, _POSIX_COURS; (2001-2016; ग्लोबली)। _XOPEN_SOURCE 700 के साथ मूल्य (2.10 से पहले glibc संस्करणों में 600), 2.2 से पहले glibc संस्करणों में 500)। इसके अतिरिक्त, विभिन्न GNU- विशिष्ट एक्सटेंशन भी सामने आते हैं।

2.19 glibc के बाद से, _GNU_SOURCE को परिभाषित करने का भी प्रभाव स्पष्ट रूप से _DEFAULT_SOURCE को परिभाषित करने पर पड़ता है। 2.20 से पहले glibc संस्करणों में, _GNU_SOURCE को परिभाषित करना भी _BSD_SOURCE और _SVID_SOURCE को स्पष्ट रूप से परिभाषित करने का प्रभाव था।

नोट : हेडर फ़ाइलों को शामिल _GNU_SOURCEकरने से पहले परिभाषित करने की आवश्यकता है ताकि संबंधित हेडर सुविधाओं को सक्षम कर सकें। उदाहरण के लिए:

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
...

_GNU_SOURCE-Dध्वज का उपयोग करके प्रति संकलन भी सक्षम किया जा सकता है :

$ gcc -D_GNU_SOURCE file.c

( लेकिन किसी मैक्रो को इस तरह परिभाषित नहीं किया जाता है) के -Dलिए विशिष्ट नहीं है _GNU_SOURCE


4

Google के माध्यम से कुछ मेलिंग सूची से:

Glibc के शामिल / फीचर्स को देखें:

_GNU_SOURCE उपरोक्त सभी, प्लस GNU एक्सटेंशन।

इसका मतलब यह है कि यह सब सक्षम बनाता है:

STRICT_ANSI , _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _MOSGE_OOURCE_OOMCE_OOURCE

तो यह gcc के लिए बहुत सारे संकलित झंडे सक्षम करता है


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