2014-10-22 7 views
12

मैं सख्त सी 0 9 अनुरूपता परीक्षण करते समय उपयोग करने के लिए जीसीसी झंडे के संयोजन का पता लगाने की कोशिश कर रहा हूं। पिछली पोस्ट के अनुसार: GCC options for strictest C code?, मुझे केवल एक --std = c90 की आवश्यकता होनी चाहिए। (कोई चेतावनी/त्रुटियों का उत्पादन)जीसीसी विकल्प?

$ cat t.c 
#include <stdint.h> /* added in C99 */ 

int main() 
{ 
    uint64_t t; 
    return 0; 
} 
$ gcc -std=c90 -ansi -pedantic t.c 

ऊपर अच्छी तरह से काम करता है:

हालांकि यहाँ मैं क्या करने की कोशिश की है। झंडे के अलग सेट 1990 अनुरूपता

  • एक अलग संकलक (TCC, बजना ...):

    1. जीसीसी झंडे सख्त आईएसओ/आईईसी 9899 के लिए:

      किसी का पता है? (C99 के लिए आता है

      मेरे शब्दों के लिए क्षमा करें, हाँ मैं वास्तव में एक सख्ती अनुरूप C90 संकलक नकल करने के लिए, चाहते हैं कोड किसी भी सुविधा बाद में जोड़ा उपयोग करने के लिए कोशिश करता है तो दूसरे शब्दों में इसे विफल करना चाहिए:

    संपादित करें मन)। pthread में शामिल है जो GNU/GCC calls C90 mode में संकलित करते समय चेतावनी को उत्सर्जित करने के लिए है (जैसे stdint.h शीर्षलेख को सी 99 के बिना चेतावनी देना चाहिए)। -पैंटिक ने मुझे long long के उपयोग के बारे में अच्छी तरह से चेतावनी दी है, मुझे नहीं लगता कि मुझे uint64_t के बारे में चेतावनी क्यों नहीं देनी चाहिए।

    1990 में, एएनएसआई सी मानक (स्वरूपण परिवर्तन के साथ) द्वारा अपनाया गया था: के रूप में से उद्धृत 1990:

    मैं आईएसओ/आईईसी की शब्दावली 9899 का इस्तेमाल किया मानकीकरण के लिए अंतर्राष्ट्रीय संगठन (आईएसओ) आईएसओ/आईईसी 98 99: 1 99 0, जिसे कभी-कभी सी 0 9 कहा जाता है। इसलिए, "C89" और "C90" शब्द समान प्रोग्रामिंग भाषा का संदर्भ लेते हैं।

    EDIT2:

    जीसीसी प्रलेखन वास्तव में काफी स्पष्ट हैं:

    कुछ विशेषताएं है कि C99 मानक का हिस्सा C90 मोड में एक्सटेंशन के रूप में स्वीकार कर रहे हैं, और कुछ विशेषताएं है कि का हिस्सा हैं C11 मानक C90 और C99 मोड में एक्सटेंशन के रूप में स्वीकार किए जाते हैं।

    तो मेरे सवाल में rephrased है:

    • वहाँ एक संकलक + मानक एक लिनक्स प्रणाली है जो सख्ती से C90 के अनुरूप है पर शीर्ष लेख शामिल है?
  • +1

    कृपया ध्यान दें कि मानक आईएसओ/आईईसी 98 99 में सी 9 0 निर्दिष्ट है। आप आईएसओ/आईईसी 9945-1 पूछते हैं जो पॉज़िक्स मानक है। – Lundin

    +0

    मैंने एक कंपाइलर के बारे में नहीं सुना है जो आपको यह जांचने की अनुमति देता है। 3. कंपाइलर लाइब्रेरी के साथ जीसीसी और क्लैंग जैसे कुछ कंपाइलर्स अनुरोधित मानक का समर्थन करने के लिए उचित लंबाई तक जाते हैं, खासकर भाषा स्तर पर, लेकिन वे अनुपालन चेकर्स होने के लिए नहीं हैं। लाइब्रेरी फीचर्स के लिए यह और भी मूक है, क्योंकि सी गैर-मानक लाइब्रेरी/हेडर उपलब्ध होने की अनुमति देता है, कुछ भी c89 कंपाइलर में stdint.h की आपूर्ति से कार्यान्वयन को रोकता है - उदा। जीसीसी और क्लैंग लाइब्रेरी/हेडर फाइलों की आपूर्ति नहीं करता है - यह 3. पार्टी (अक्सर लिनक्स पर ग्लिब) पर छोड़ दिया जाता है – nos

    +1

    आप कहते हैं * एक चेतावनी उत्सर्जित करने के लिए * चाहिए, आपका सबूत कहां है? मानक के माध्यम से मिलकर मैं कहीं भी नहीं देखता जहां यह कहता है कि एक कंपाइलर को निदान करने के लिए एक कंपाइलर की आवश्यकता होती है। –

    उत्तर

    1

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

    क्या आप चाहते हैं कुछ है कि न केवल आपको चेतावनी देता है जब आप एक C99 उपयोग कर रहे हैं/सी 11/जीएनयू भाषा विशेषता यह है कि C90 में नहीं है, लेकिन जब आप एक पुस्तकालय फ़ंक्शन का उपयोग C90 से ही परिभाषित नहीं है कि । अफसोस की बात है, अकेले संकलक ऊपर बताए गए कारण के लिए ऐसा नहीं कर सकते हैं - यह libc के साथ प्रयोग किया जाता है। glibc सिस्टम पर, सी मानक पुस्तकालय मैक्रो -std=c90 या -ansi द्वारा परिभाषित पर लेने देगा: जब -ansi विकल्प प्रयोग किया जाता है

    मैक्रो __STRICT_ANSI__ पूर्वनिर्धारित है। कुछ हेडर फाइलें इस मैक्रो को नोटिस कर सकती हैं और कुछ फ़ंक्शंस घोषित करने या कुछ मैक्रोज़ को परिभाषित करने से बचना चाहती हैं जिन्हें आईएसओ मानक कॉल नहीं करता है; यह किसी भी प्रोग्राम के साथ हस्तक्षेप से बचने के लिए है जो इन नामों का उपयोग अन्य चीजों के लिए कर सकता है।

    और आप नि: शुल्क एक्सटेंशन को बंद करके कुछ मदद दे: आप ‘gcc -ansi’ का उपयोग कर अपने कार्यक्रमों संकलन तो

    , आप केवल आईएसओ सी पुस्तकालय सुविधाओं मिलता है, जब तक आप स्पष्ट एक या परिभाषित करते हुए अतिरिक्त सुविधाओं का अनुरोध सुविधा मैक्रोज़ के अधिक।

    हालांकि, इसमें केवल एक्सटेंशन और POSIX-but-not-ISO-C कार्यों को शामिल नहीं किया गया है; यदि आईएसओ सी और POSIX.1 में फ़ंक्शन का व्यवहार अलग-अलग निर्दिष्ट किया गया है तो यह आपको सहेज नहीं पाएगा!

    12

    C90 अनुपालन मतलब यह नहीं है कि संकलक अन्य हेडर कि C90 मानक में वर्णित नहीं हैं की पेशकश नहीं कर सकते हैं। (उदाहरण के लिए, sys/socket.h।) यदि आप कुछ अजीब कारणों से इन्हें अस्वीकार करना चाहते हैं, तो आप अतिरिक्त अतिरिक्त पथ जोड़ने के लिए -I विकल्प पास कर सकते हैं, और उस पथ में सभी C99-only शीर्षलेखों के संस्करण डाल सकते हैं जो कि #error Don't include me हैं।

    +2

    "कुछ अजीब कारणों के लिए" - कारण बिल्कुल अजीब नहीं है। यदि ओपी अपने कोड का परीक्षण करना चाहता है ताकि यह सुनिश्चित किया जा सके कि इसमें कोई सी 99- या ओएस-विशिष्ट निर्भरता नहीं है, तो वे निश्चित रूप से ** ** उन शीर्षकों का उपयोग करने से खुद को प्रतिबंधित करना चाहते हैं। –

    +0

    संकलक के लिए दिए गए शीर्षलेख को पार्स करना भी संभव है, मैक्रोज़ को हल करें, और इसमें कुछ भी शामिल न करें, क्योंकि मैक्रो का विस्तार करने और सशर्तियों का मूल्यांकन करने के बाद हेडर किसी भी टेक्स्ट/कोड को शामिल करने के लिए उत्पन्न नहीं करता है संकलक को पारित विकल्पों का नतीजा। आखिरकार अवांछित समावेशन के खिलाफ अपने हेडर को सुरक्षित रखने के लिए '# ifdef' या' ifndef' या अन्य विकल्पों का उपयोग करना मुश्किल नहीं है। – user2485710

    +0

    @TheParamagneticCroissant मुझे किसी भी कंपाइलर/रनटाइम के बारे में पता नहीं है जो विशेष रूप से सी 99 संरचनाओं को अस्वीकार करने के उद्देश्य से मौजूद है। यह बनाए रखने के लिए एक पूरी तरह से अपरिवर्तनीय संकलक होगा। जीसीसी द्वारा प्रदान किए गए सी 0 9 हेडर में भी, मुझे यकीन है कि फ़ंक्शन परिभाषाएं हैं जो सी 9 0 मानक का हिस्सा नहीं थीं। – Sneftel

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