आईएसओ सी 90 सी में मिश्रित घोषणाओं और कोड को निषिद्ध करता है


83

मैंने इस तरह एक चर घोषित किया:

मुझे चेतावनी मिली:

आईएसओ C90 मिश्रित घोषणाओं और कोड को निषिद्ध करता है

मेरे द्वारा यह कैसे किया जा सकता है?


2
यह ऐसा लगता है जैसे जीसीसी -pedanticया -std=c89, जिस स्थिति में आप चाहें तो इसे संकलित कर सकते -std=gnu99हैं।
डिट्रीच एप्प

3
यदि आप gcc का उपयोग कर रहे हैं तो आप C99 का उपयोग करने के लिए निर्दिष्ट कर सकते हैं जो मिश्रित घोषणाओं और कोड (ध्वज -std=c99) की अनुमति देता है ।
hmjd

11
एक विकल्प यह होगा कि एक मानक को संकलित करना बंद कर दिया जाए जो कि 22 साल पुराना है जिसके लिए भी प्रतिस्थापन किया गया है।
स्टीफन कैनन

5
@StephenCanon, कृपया Microsoft को बताएं कि :)
hmjd

2
@ शहजाद: माइक्रोसॉफ्ट को सी कंपाइलर की शिपिंग में कोई दिलचस्पी नहीं है; यह संभवतः नहीं बदलेगा। सौभाग्य से, वहाँ अन्य विक्रेताओं द्वारा आपूर्ति मंच को लक्षित करने के लिए पूरी तरह से अच्छे संकलक हैं।
स्टीफन कैनन

जवाबों:


127

मुझे लगता है कि आपको चर घोषणा को ब्लॉक के ऊपर ले जाना चाहिए। अर्थात

सेवा


5
... या एक ताजा संदर्भ खोलें:{foo(); {int i=0; bar();}}
ALK

3
@ पलक / संदर्भ / ब्लॉक यह वही है जो सी मानक में कहा जाता है।
जेन्स

@ जोहान कोटलींस्की लेकिन यह मामला क्यों है?
महासागर 800

1
@ Ocean800 C90 विनिर्देश ने कहा कि आपके पास एक ही ब्लॉक में गैर-घोषणाओं के बाद घोषणाएं नहीं हो सकती हैं।
MM

37

C99 मानक तक, सभी घोषणाओं को एक ब्लॉक में किसी भी बयान से पहले आना था:

C99 घोषणाओं और बयानों को मिलाने की अनुमति देता है (जैसे C ++)। कई कंपाइलर अभी भी C89 के लिए डिफॉल्ट हैं, और कुछ कंपाइलर (जैसे माइक्रोसॉफ्ट के) C99 को बिल्कुल भी सपोर्ट नहीं करते हैं ।

तो, आपको निम्नलिखित कार्य करने होंगे:

  1. निर्धारित करें कि क्या आपका कंपाइलर C99 या बाद में सपोर्ट करता है; यदि ऐसा होता है, तो इसे कॉन्फ़िगर करें ताकि यह C89 के बजाय C99 को संकलित करे;

  2. यदि आपका कंपाइलर C99 या बाद में सपोर्ट नहीं करता है, तो आपको या तो एक अलग कंपाइलर ढूंढना होगा, जो इसे सपोर्ट करता हो, या आपके कोड को फिर से लिखना ताकि सभी डिक्लेरेशन ब्लॉक के भीतर किसी भी स्टेटमेंट से पहले आ जाएं।


11

बस एक संकलक का उपयोग करें (या इसे ज़रूरत के तर्कों के साथ प्रदान करें) जैसे कि यह सी मानक, C99 या C11 के अधिक हाल के संस्करण के लिए संकलित करता है। उदाहरण के लिए, कंपाइलर के GCC परिवार के लिए -std=c99


6
यह उत्तर सबसे अच्छा है। यह समस्या को ठीक करता है, लेकिन इसका कारण क्या है यह स्पष्ट नहीं करता है। यह उत्तर उन स्थितियों को शामिल करता है जहां एक नया संकलक संभव नहीं है (कई संभावित कारण ...) या ऐसे वातावरण का निर्माण करें जहां संकलक के लिए विकल्प स्विच करना संभव नहीं है। एक डाउन वोट क्योंकि मैं सहमत नहीं हो सकता यह "असली" जवाब है।
एंड्रयू फेलंगा

1
कुछ मामलों -std=gnu89में लिनक्स कर्नेल मॉड्यूल का संकलन करते समय उपयोग किया जाता है।
cbix

4

सुनिश्चित करें कि चर ब्लॉक के शीर्ष भाग पर है, और यदि आप इसे संकलित करते हैं -ansi-pedantic, तो सुनिश्चित करें कि यह इस तरह दिखता है:


आप अभी भी वैरिएबल को इनिशियलाइज़ कर सकते हैं, इसे घोषित करने से पहले आप कोड नहीं डाल सकते।
एसएस ऐनी

2

यह पता लगाने के लिए कि वास्तव में त्रुटि क्या होती है, मैं पहले हटाने की कोशिश करूंगा = 0

  • यदि त्रुटि फंस गई है, तो सबसे अधिक संभावना कोड के बाद घोषणा की जाती है।

  • यदि कोई त्रुटि नहीं है, तो यह सी-मानक प्रवर्तन / संकलित झंडे या ... कुछ और से संबंधित हो सकता है।

किसी भी स्थिति में, वर्तमान क्षेत्र की शुरुआत में चर घोषित करें। फिर आप इसे अलग से इनिशियलाइज़ कर सकते हैं। वास्तव में, यदि यह चर अपने दायरे के लायक है - तो इसकी परिभाषा को {} में परिसीमित करें।

यदि ओपी संदर्भ को स्पष्ट कर सकता है, तो एक अधिक निर्देशित प्रतिक्रिया का पालन होगा।


1

-Wdeclaration-after-statement न्यूनतम प्रजनन योग्य उदाहरण

main.c

चेतावनी दें:

चेतावनी न दें:

चेतावनी:

उबंटू 16.04, जीसीसी 6.4.0 पर परीक्षण किया गया।

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