-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 ++ के लिए स्वीकार करता है, जितना कि यह मूर्खतापूर्ण लगता है।