2010-06-23 18 views
11

मैं एक कोड बेस पर काम करता हूं जो ज्यादातर सी ++ के साथ सी होता है, और ज्यादातर जीसीसी के साथ बनाया जाता है लेकिन कभी-कभी इसे एमएसवीसी के साथ बनाया जाना चाहिए। माइक्रोसॉफ्ट के सी कंपाइलर अभी भी कुछ मामूली एक्सटेंशन के साथ बहुत अधिक सी 8 9 है, और यह अभी भी मिश्रित कोड और परिवर्तनीय परिभाषाओं का समर्थन नहीं करता है à la सी ++/सी 99। तो मुझे डेवलपर्स को जीसीसी के साथ काम करते समय आउट-ऑफ-ऑर्डर कोड/वैरिएबल परिभाषा लिखने से रोकने के लिए एक रास्ता खोजने की जरूरत है, अन्यथा निर्माण बाद में एमएसवीसी के साथ टूट जाता है। अगर मैं gcc -std=c89 का उपयोग करता हूं तो सबकुछ टूट जाता है क्योंकि सी ++ - स्टाइल टिप्पणियों की अनुमति नहीं है (अन्य मुद्दे भी हो सकते हैं, लेकिन मैंने इसे और आगे नहीं देखा है)। अगर मैं gcc -std=gnu89 का उपयोग करता हूं तो आउट-ऑफ-ऑर्डर कोड/चर परिभाषाओं की अनुमति है, जिससे यह मेरी मदद नहीं करता है। कोई विचार ? मुझे लगता है कि अगर ऐसा कोई विकल्प मौजूद है तो मुझे बस gcc -std=c99 -fno-inline-variable-definitions की तरह कुछ चाहिए।जीसीसी में सी 8 9-शैली परिवर्तनीय घोषणाओं को कैसे लागू करें?

उत्तर

13

आप gcc warnings info page पर वर्णित है -Wall-Wextra-Wstrict-prototypes-Wold-style-definition-Wmissing-prototypes-Wmissing-declarations और -Wdeclaration-after-statement विकल्पों के बाद कर रहे हैं। ध्यान दें कि ये सिस्टम हेडर फ़ाइलों में समस्याओं से बहुत शोर का कारण बन सकता है, और वे केवल चेतावनियां हैं इसलिए आपको शून्य-चेतावनी निर्माण करने के इच्छुक होने की नीति होना चाहिए।

+0

धन्यवाद - मैंने '-उडक्लेरेशन-आफ-स्टेटमेंट' नहीं देखा था - इससे थोड़ा सा मदद करनी चाहिए - अब मुझे यह सुनिश्चित करना है कि डेवलपर्स अपनी सभी चेतावनियों को ठीक कर दें। –

+10

आप इसे एक त्रुटि में बदलने के लिए '-उडक्लेरेशन-बाद-कथन-वार्ता = घोषणा-बाद-कथन' कर सकते हैं। –

+0

@ मैथ्यू: अब वह एक स्निपेट है जिसे मैं नहीं जानता था। –

3

मुझे विश्वास नहीं है कि आप जो चाहते हैं उसे करने का एक तरीका है। एमएसवीसी द्वारा समर्थित सी की बोली सी 99 की तुलना में सी 8 9 के करीब है (उदाहरण के लिए। यह नामित प्रारंभकर्ताओं का समर्थन नहीं करता है); आप वास्तव में C89-with-C++ - टिप्पणियां-और-इनलाइन-कीवर्ड के समान कुछ और चाहते हैं।

के साथ समस्या यह है कि यह है कि C++ टिप्पणियां वैध C89 कोड की शुद्धता को प्रभावित कर सकती हैं। उदाहरण के लिए, इस लाइन का अर्थ काफी हद तक परिवर्तन:

int a = 10//* foo */2; 

मैं कहना चाहता हूँ आपका सर्वश्रेष्ठ दांव अपनी सी स्रोत फ़ाइलों में C89 लागू करने के लिए, C89 वाली शैली में टिप्पणियां भी शामिल है। inline शायद ठीक है, हालांकि: आप इसे जीसीसी पर __inline पर परिभाषित कर सकते हैं।

+0

दूसरा उत्तर काम करता है, लेकिन मुझे लगता है कि यह बहुत अधिक संभावना है। मुझे यह जवाब बेहतर पसंद है। बस सी ++ शैली टिप्पणियों का उपयोग न करें। – Omnifarious

+0

दुर्भाग्यवश यह बहुत सारे डेवलपर्स के साथ एक बड़ा कोड बेस है - टिप्पणियों पर एक बड़े पैमाने पर खोज और प्रतिस्थापन करना एक बड़ा प्रयास होगा (विशेष रूप से सभी स्रोत नियंत्रण मुद्दों जो इसके परिणामस्वरूप होंगे) और डेवलपर शायद विद्रोह करेंगे पुरानी शैली सी टिप्पणियों का उपयोग करने के लिए मजबूर किया। अन्य सी 8 9 प्रतिबंध भी हो सकते हैं जिन्हें हम चारों ओर काम नहीं कर सके। हम * वास्तव में * जीएनयू 8 9 या सी 99 की आवश्यकता है, लेकिन सी ++ - शैली परिवर्तनीय घोषणाओं के बिना जो एमएसवीसी को बार्फ़ करने का कारण बनता है। –

1

यह Win32 नहीं है जो कोड को असम्पीडित करता है, लेकिन संकलक। आप GCC on Win32 का उपयोग कर सकते हैं और अधिक क्रॉस-प्लेटफ़ॉर्म संगतता प्राप्त कर सकते हैं।

एक और संभावना आपके Win32 निर्माण के लिए C++ संकलन का उपयोग करना है; जीसीसी संकलन पहले ही निर्धारित कर चुका है कि यह वैध सी है, और सी ++ संकलन आम तौर पर इसे मजबूत सी भी बना देगा।

[संपादित करें] एक अन्य समाधान ताकि जब भी जीसीसी मंच कोडर चेक-इन कोड, सीआई सर्वर इसे बाहर की जाँच करें और कुलपति का उपयोग कर इसे निर्माण कर सकते हैं इस तरह के CruiseControl कॉन्फ़िगर किया गया के रूप में एक सतत एकीकरण सर्वर का उपयोग करने ++ है (या यहाँ तक लागू एक तृतीय-पक्ष स्थिर विश्लेषण टूल) और त्रुटि पर उपयोगकर्ता को परिणामस्वरूप ई-मेल करें जो गलत कोड में चेक किए गए हैं। यह समस्या मूल समस्या के लिए हेवीवेट हो सकती है, लेकिन इसके अलावा कई अन्य लाभ भी मिल सकती हैं।

+0

'gcc -std = c89' ** ** ** सी ++ - शैली टिप्पणियों की अनुमति नहीं देता है, इसलिए यह एक व्यावहारिक समाधान नहीं है। –

+0

@ पॉल आर: क्षमा करें पॉल मैंने टिप्पणी पोस्ट करने से पहले उस कथन को हटा दिया (और जब मैंने आपकी पोस्ट को और सावधानी से पढ़ा)। – Clifford

+0

@ क्लाइफोर्ड - कोई समस्या नहीं - डाउनवोट हटा दिया गया। सी ++ संकलन शायद एक विकल्प नहीं है - हमें कोड बेस में बहुत सारे बदलाव करने की आवश्यकता होगी, उदा। कॉल के परिणाम को malloc पर कास्टिंग और सी और सी ++ के बीच कई अन्य सूक्ष्म मतभेदों से निपटना। –