जीसीसी / जी ++ संकलक में -पेटेटिक का उपयोग करने का उद्देश्य क्या है?


136

यह नोट कहता है:

-ansi: एएनएसआई भाषा विकल्प को लागू करने के लिए संकलक को बताता है। यह GCC के कुछ "फीचर्स" को बंद कर देता है जो ANSI मानक के साथ असंगत हैं।

-pedantic: के साथ संयोजन के रूप में उपयोग किया जाता है -ansi, यह संकलक को एएनएसआई मानक का कड़ाई से पालन करने के लिए कहता है, जो किसी भी कोड को अस्वीकार नहीं करता है।

पहली चीजें पहले:

  • GCC / G ++ कंपाइलर के विकल्पों -pedanticऔर -ansiविकल्पों का क्या उद्देश्य है (मैं उपरोक्त विवरण को समझ नहीं सका)?
  • क्या कोई मुझे इन दो विकल्पों का उपयोग करने के लिए सही परिस्थितियां बता सकता है?
  • मुझे उनका उपयोग कब करना चाहिए?
  • क्या वे महत्वपूर्ण हैं?

जवाबों:


84

जीसीसी कंपाइलर हमेशा अपने कार्यक्रम को संकलित करने की कोशिश करते हैं यदि यह संभव है। हालाँकि, कुछ मामलों में, C और C ++ मानक निर्दिष्ट करते हैं कि कुछ एक्सटेंशन वर्जित हैं। जब ये एक्सटेंशन सामने आते हैं, तो जीसीसी या जी ++ जैसे संकलक एक डायग्नोस्टिक जारी करना चाहिए। उदाहरण के लिए, gcc संकलक के विकल्प के कारण ऐसे मामलों में चेतावनी जारी करने के लिए gcc का कारण बनता है। सख्त -pedantic-errorsविकल्प का उपयोग करके ऐसे नैदानिक ​​चेतावनियों को त्रुटियों में परिवर्तित किया जाता है, जो इस तरह के बिंदुओं पर संकलन को विफल कर देगा। केवल उन गैर-आईएसओ निर्माणों को एक अनुरूप संकलक द्वारा चिह्नित किए जाने की आवश्यकता होती है जो चेतावनी या त्रुटियां उत्पन्न करेंगे।


3
आईएसओ सी और सी ++ मानकों में केवल "एक्सटेंशन पर प्रतिबंध" है, इस एक्सटेंशन में किसी भी अनुरूप कार्यक्रम के व्यवहार को नहीं बदलना चाहिए। संकलक एक्सटेंशन का उपयोग करने वाले किसी भी कार्यक्रम को अस्वीकार करने के लिए मजबूर नहीं है।
एमएम

@MM: यह ध्यान रखना महत्वपूर्ण है कि जब कुछ संकलक एक उपयोगी निर्माण को स्वीकार करेंगे और अन्य लोग इसे अस्वीकार कर देंगे, तो समिति के "समझौता" के अनुरूप कार्यान्वयन होना चाहिए, एक निदान जारी करना होगा जिसे प्रोग्रामर तब अनदेखा कर सकते हैं, इस प्रकार समिति की आवश्यकता को टाल सकते हैं। या तो जनादेश या निर्माण की मनाही है।
सुपरकैट

105

मैं अपने कोडिंग में हर समय इसका उपयोग करता हूं।

-ansiध्वज के बराबर है -std=c89। जैसा कि कहा गया है, यह जीसीसी के कुछ एक्सटेंशन को बंद कर देता है। -pedanticअधिक एक्सटेंशन जोड़ने से और अधिक चेतावनी उत्पन्न होती है। उदाहरण के लिए, यदि आपके पास 509 वर्णों से अधिक लंबा शाब्दिक है, तो इसके -pedanticबारे में चेतावनी देता है क्योंकि यह C89 मानक द्वारा आवश्यक न्यूनतम सीमा से अधिक है। यही है, प्रत्येक C89 संकलक को 509 की लंबाई के तारों को स्वीकार करना चाहिए; उन्हें लंबे समय तक स्वीकार करने की अनुमति है, लेकिन यदि आप पांडित्यपूर्ण हैं, तो लंबे समय तक तार का उपयोग करने के लिए पोर्टेबल नहीं है, भले ही एक संकलक को लंबे समय तक तार को स्वीकार करने की अनुमति दी जाती है और, पीडियाटिक चेतावनी के बिना, जीसीसी उन्हें भी स्वीकार करेगा।


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

4
@ huahsin68: अच्छी तरह से, कम या ज्यादा। MSVC अधिकांश अन्य लोगों के बजाय एक अलग संकलक है, जो अपने विशेष पारिस्थितिकी तंत्र के लिए अधिक अनुकूलित है और इसके बाहर उपलब्ध नहीं है। यह बहुत सारी चीजों को अपने तरीके से करता है - जो मानक के समान नहीं है। फिर भी, यदि आप मानक हेडर और इतने पर रहते हैं, तो MSVC और GCC काफी समान हैं। हालांकि, -std=c89 -pedanticइसका उपयोग करने का मतलब है कि आप अन्य प्लेटफार्मों पर विभिन्न कंपाइलरों के बीच अधिक आसानी से स्थानांतरित कर सकते हैं। जैसे ही आप उपयोग करना शुरू करते हैं <windows.h>, अन्य प्रणालियों के साथ संगतता समस्याग्रस्त हो जाती है।
जोनाथन लेफ़लर

2
@ शेल्फ: क्योंकि हर दूसरे विक्रेता की तरह (इसके बावजूद कि GNU कैश के लिए अपना कंपाइलर नहीं बेचता है), वे चाहेंगे कि आप उनकी मालिकाना सुविधाओं का इस्तेमाल करें? या, अधिक सामान्यतः, क्योंकि वे एक्सटेंशन को उपयोगी मानते हैं और सोचते हैं कि उन्हें डिफ़ॉल्ट रूप से सक्षम होना चाहिए।
जोनाथन लेफ़लर

1
जो कुछ भी इसके लायक है, और JFTR के लिए , मैंने ज्यादातर का उपयोग करना बंद कर दिया है -pedantic, लेकिन मेरे कोड के अधिकांश अभी भी ठीक हैं जब मैं इसे फिर से सक्षम करता हूं (एक प्रोग्राम जो स्पष्ट रूप से __int128प्रकारों का उपयोग नहीं कर रहा था , जो कि पेडेंटिक रूप से गलत हैं)। मुझे लगता है कि जब जीसीसी बहुत शोर (मेरी पसंद के लिए) के साथ एक हस्तक्षेप चरण था -pedantic। मैंने सिर्फ 300 स्रोत फ़ाइलों के बारे में परीक्षण किया - कुछ पुस्तकालय कोड, कुछ कमांड, कुछ एसओ परीक्षण कार्यक्रम - और बस एक-से-अपेक्षित समस्या थी। वर्तमान में मैक ओएस एक्स 10.9.2 पर जीसीसी 4.8.2 का उपयोग कर रहा है।
जोनाथन लेफ़लर

1
@JonathanLeffler, हाँ, मैं प्रश्न कर रहा हूँ कि व्यवहार में एक वास्तविक संकलक का नाम क्या है जहाँ यह काम नहीं करेगा? क्या ऐसा एक भी कंपाइलर है?
पचेरियर

23

-ansiएक अप्रचलित स्विच है जो सी मानक , आईएसओ / आईईसी 9899: 1990 के 30 वर्षीय अप्रचलित संशोधन के अनुसार संकलक का अनुरोध करने के लिए अनुरोध करता है , जो अनिवार्य रूप से एएनएसआई मानक X3.159-1989 "प्रोग्रामिंग भाषा सी का एक रीब्रांडिंग है । अप्रचलित क्यों? क्योंकि आईएसओ द्वारा C90 प्रकाशित होने के बाद, आईएसओ C मानकीकरण का प्रभारी रहा है, और C90 के लिए कोई भी तकनीकी गलियारा आईएसओ द्वारा प्रकाशित किया गया है। इस प्रकार इसका उपयोग करने के लिए अधिक उपयुक्त है -std=c90

इस स्विच के बिना, हाल ही में जीसीसी सी कंपाइलर्स आईएसओ / आईईसी 9899: 2011 , या नवीनतम 2018 संशोधन में मानकीकृत सी भाषा के अनुरूप होंगे ।

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

स्विच का उपयोग करने से यह सुनिश्चित करने में मदद मिलती है कि कोड को इन अप्रचलित संकलक में संकलित करना चाहिए।


-pedanticएक दिलचस्प एक है। के अभाव में -pedantic, तब भी जब एक विशिष्ट मानक अनुरोध किया जाता है, जीसीसी अभी भी कुछ एक्सटेंशन जो सी मानक में स्वीकार्य नहीं हैं की अनुमति देगा। उदाहरण के लिए कार्यक्रम पर विचार करें

struct test {
    int zero_size_array[0];
};

C11 मसौदा n1570 पैरा 6.7.6.2p1 का कहना है :

वैकल्पिक प्रकार क्वालीफायर और कीवर्ड स्थिर के अलावा, [और] एक अभिव्यक्ति या * का परिसीमन कर सकता है। यदि वे एक अभिव्यक्ति का परिसीमन करते हैं (जो किसी सरणी के आकार को निर्दिष्ट करता है), तो अभिव्यक्ति का पूर्णांक प्रकार होगा। यदि अभिव्यक्ति एक स्थिर अभिव्यक्ति है, तो इसका मूल्य शून्य से अधिक होगा। [...]

सी मानक की आवश्यकता है कि सरणी की लंबाई शून्य से अधिक हो; और यह पैरा बाधाओं में है ; मानक निम्नलिखित 5.1.1.3p1 कहते हैं :

एक अनुरूपण कार्यान्वयन कम से कम एक डायग्नोस्टिक संदेश (कार्यान्वयन-परिभाषित तरीके से पहचाना गया) का उत्पादन करेगा यदि प्रीप्रोसेसिंग अनुवाद इकाई या अनुवाद इकाई में किसी भी वाक्यविन्यास नियम या बाधा का उल्लंघन होता है, भले ही व्यवहार को स्पष्ट रूप से अपरिष्कृत या कार्यान्वयन के रूप में निर्दिष्ट किया गया हो- परिभाषित। अन्य परिस्थितियों में नैदानिक ​​संदेशों का उत्पादन नहीं किया जाना चाहिए। 9)

हालाँकि, यदि आप प्रोग्राम को संकलित करते हैं, तो gcc -c -std=c90 pedantic_test.cकोई चेतावनी उत्पन्न नहीं होती है।

-pedanticकंपाइलर वास्तव में सी मानक का पालन करने का कारण बनता है ; तो अब यह एक नैदानिक ​​संदेश का उत्पादन करेगा, जैसा कि मानक द्वारा आवश्यक है:

gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array zero_size_array [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~

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


प्रश्न का अंतिम भाग C ++ के-ansi साथ उपयोग करने के बारे में था । ANSI ने कभी भी C ++ भाषा को मानकीकृत नहीं किया - केवल इसे ISO से अपनाया, इसलिए यह "फ्रांस द्वारा मानकीकृत अंग्रेजी" कहने के बारे में अधिक समझ में आता है। हालाँकि GCC अभी भी इसे C ++ के लिए स्वीकार करता है, जितना कि यह मूर्खतापूर्ण लगता है।


4
ध्यान दें कि भाषा मानक के और भी संशोधन हुए हैं। आज मैं आम तौर पर संकलन करता हूं -std=c11 -Wall -Wextra -Wpedantic -Wconversion
डेविस्लोरे

14

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

पहले वाला, जीसीसी की विशिष्ट विशेषताओं को बंद कर देता है। (-ांसी) दूसरा, किसी भी चीज के बारे में शिकायत करेगा जो मानक का पालन नहीं करता है (न केवल जीसीसी की विशिष्ट विशेषताएं, बल्कि आपके निर्माण भी)।


6

यदि आपके कोड को पोर्टेबल होना चाहिए तो आप परीक्षण कर सकते हैं कि यह बिना किसी gcc एक्सटेंशन या अन्य गैर-मानक सुविधाओं के बिना संकलित है। यदि आपका कोड -pedantic -ansiसिद्धांत के साथ संकलित करता है, तो उसे किसी अन्य ANSI मानक संकलक के साथ OK संकलित करना चाहिए।


4
-pedanticसभी एक्सटेंशन को बंद नहीं करता है, यह डबल-अंडरस्कोर सामान के एक गुच्छा पर निकलता है। इसलिए यह कहना अधिक सटीक हो सकता है कि यदि आपका कोड संकलित करता है -pedantic -ansi, और यह भी पूरी तरह से ऐसा लगता है जैसे यह अन्य कार्यान्वयन पर संकलित कर सकता है, तो यह संकलन करेगा।
स्टीव जेसोप

3
आप डबल-अंडरस्कोर सामान का उल्लेख करते हैं, यह ध्वनि दिलचस्प है। आप वास्तव में क्या उल्लेख कर रहे हैं?
हुहसिन68

एक उदाहरण है gcc का "__asm ​​__ ()" इनलाइन असेंबली कोड, जो gcc के लिए ठीक है, लेकिन वह डबल अंडरस्कोर चीज़ विंडोज कंपाइलर के कहने पर काम नहीं कर सकती है, भले ही उस कंपाइलर ने मानक का पालन किया हो।

3

यदि आप ऐसा कोड लिख रहे हैं जो आप परिकल्पित करते हैं, तो आप कई अलग-अलग प्रकार के प्लेटफ़ॉर्म पर कई अलग-अलग कंपाइलरों के साथ संकलित होने जा रहे हैं, तो इन झंडों का उपयोग करने से आपको यह सुनिश्चित करने में मदद मिलेगी कि आप कोड का उत्पादन न करें जो केवल जीसीसी के तहत संकलित करता है।


2
GCC के कुछ संस्करणों के तहत!
मोहम्मद अमजद LASRI

1

दूसरों ने पर्याप्त उत्तर दिए हैं। मैं बार-बार एक्सटेंशन के कुछ उदाहरण जोड़ना चाहूंगा:

mainसमारोह लौटने void। यह मानक द्वारा परिभाषित नहीं है, जिसका अर्थ है कि यह केवल कुछ संकलक (जीसीसी सहित) पर काम करेगा, लेकिन दूसरों पर नहीं। वैसे, int main()और int main(int, char**)दो हस्ताक्षर हैं जो मानक परिभाषित करते हैं।

एक अन्य लोकप्रिय विस्तार अन्य कार्यों के अंदर कार्यों को घोषित करने और परिभाषित करने में सक्षम हो रहा है:

void f()
{
    void g()
    {
       // ...
    }

    // ...
    g();
    // ...
}

यह अमानवीय है। यदि आप इस तरह का व्यवहार चाहते हैं, तो C ++ 11 लैंबडास देखें


0

पिकाटिक इसे इसलिए बनाता है कि gcc संकलक सभी GNU C एक्सटेंशन को अस्वीकार कर देता है, न कि केवल एएनएसआई को संगत बनाता है।


1
यह बहुत ही इंटरस्टिंग है। आप GNU C एक्सटेंशन का उल्लेख करते हैं, और वे एक्सटेंशन ANSI मानक में नहीं भी हो सकते हैं। क्या मुझे इससे संबंधित अधिक जानकारी मिल सकती है। मुझे वे उपयुक्त संसाधन कहां से मिल सकते हैं?
हुहसिन68
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.