2016-06-07 10 views
5

में क्यूए सी चेतावनी संदेश मैंने कोड का एक निम्न टुकड़ा लिखा और क्यूए सी के माध्यम से विश्लेषण किया लेकिन यह एक चेतावनी दिखाता है कि 'एक्स' में बाहरी संबंध है और इसे किसी भी पिछले घोषणा के बिना परिभाषित किया जा रहा है। कृपया इसे समझने में मेरी मदद करें।सी कोड

कोड:

#include <stdio.h> 
int x; 
void main() 
{ 
} 
+0

धन्यवाद @ एग्रीर – Santz

+1

[पुनः खोलने] के लिए कोई विशिष्ट कारण (http://stackoverflow.com/posts/37672587/revisions)? [चिह्नित कुछ भी जो चिह्नित डुप्ली चूक गया था?] (Http://stackoverflow.com/q/5110055/2173917) –

+0

क्या क्यूए सी मिसा-अनुपालन की जांच करने के लिए सेट है, प्रति मौका? – Lundin

उत्तर

5

उपकरण खराब प्रोग्रामिंग अभ्यास का उपयोग करने के खिलाफ आपको सही तरीके से चेतावनी दे रहा है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि आपके पास स्थिर विश्लेषक है जो मिसरा-सी अनुपालन की जांच के लिए सेट है।

सभी मिश्रा-सी के पहले अनुमति नहीं है "वैश्विक" चर, मिश्रा-सी: 2012 नियम 8.7:

कार्य और वस्तुओं बाहरी लिंकेज अगर वे केवल पर में संदर्भित के साथ परिभाषित नहीं किया जाना चाहिए अनुवाद इकाई

अर्थ इस चर या तो static या extern होना जरूरी होगा।

पूर्व समझ में आता है, उत्तरार्द्ध लगभग हमेशा खराब प्रोग्रामिंग अभ्यास होता है (कुछ const चर जैसे कुछ अपवादों के साथ)। 2012 नियम 8.4:

एक संगत घोषणा दिखाई जब होगा

अब, अगर आप इस चर extern का इरादा है, तो एक और नियम है, जो की संभावना त्रुटि, मिश्रा-सी का कारण है बाहरी लिंकेज के साथ एक ऑब्जेक्ट या फ़ंक्शन परिभाषित किया गया है।

मतलब यह है कि एमआईएसआरए अनुपालन के लिए, आपको बाहरी अनुवाद extern int x उसी अनुवाद इकाई के अंदर दिखाई देने की आवश्यकता होगी। एमआईएसआरए इसे हेडर फाइल में डालने की सिफारिश करता है।

यह भी ध्यान रखें कृपया इस तरह है कि बुरा कोड मानक द्वारा अप्रचलित ध्वजांकित है और सी के भविष्य के संस्करणों में काम नहीं कर सकते, सी 11 6.11.2 देखें:

पहचानकर्ता के

6.11.2 सम्पर्क

स्थिर स्टोरेजक्लास विनिर्देशक के बिना फ़ाइल स्कोप पर आंतरिक लिंकेज के साथ एक पहचानकर्ता घोषित करना एक अश्लील सुविधा है।

यहां तक ​​कि अगर यह सी द्वारा अप्रचलित अभ्यास के रूप में चिह्नित नहीं किया गया था, तब भी आप हमेशा, वैश्विक चर और extern से बचना चाहिए के बाद से है कि स्पेगेटी प्रोग्रामिंग और स्पेगेटी तंग युग्मन के लिए सड़क है। पूरी तरह से एक अलग कार्यक्रम डिजाइन पर विचार करें।

6

सभी इसका मतलब है कि x सुलभ बाहर अनुवाद ऊपर कोड युक्त इकाई हो सकता है। तो इसका मूल्य अन्य अनुवाद इकाइयों द्वारा बदला जा सकता है।

तो संकलक आपको प्रोग्राम स्थिरता के संभावित नुकसान की चेतावनी दे रहा है।

लेकिन कमरे में हाथी। उस पोर्टेबल void main() प्रोटोटाइप को ठीक करें। int main() का प्रयोग करें। कृपया सुंदर शीर्ष पर चीनी के साथ।

+0

यह हाथी नहीं है, यह एक मृत घोड़ा है ... यदि ओपी का कोड एक एम्बेडेड सिस्टम के लिए है, तो मुख्य रूप से यह प्रारूप बिल्कुल ठीक और पोर्टेबल है। [इसे देखें] (http://stackoverflow.com/a/31263079/584518)। इसके अलावा, क्यूए सी एक कंपाइलर नहीं बल्कि एक स्थिर विश्लेषक है। – Lundin