शुरुआत के लिए, चलो अपनी समस्या के बारे में बात करते हैं। मुझे लगता है कि आपके सिस्टम का सबसे संभावित कारण दूसरे सिस्टम पर एक सिस्टम पर त्रुटियां दे रहा है, यह कोड समान नहीं है; आप अपने कोड बेस में आने वाले सूक्ष्म परिवर्तनों को देखने के लिए कुछ टूल या diff
कमांड के माध्यम से इसे सत्यापित करना चाहेंगे।स्रोत फ़ाइल में
typedef struct Foo
{
int bar;
} *Fooptr;
:
typedef struct Foo* Fooptr;
एक हेडर फाइल में और उसके बाद: त्रुटि प्रकार के साथ आम तौर पर जब मैंने देखा है की समस्याओं, आप की तरह कुछ है। जिसका अर्थ है कि आप स्रोत में टाइपिफ़ को छोड़ सकते हैं और यह ठीक होना चाहिए। बस कुछ देखने के लिए।
अब अगर यह एक gcc
मुद्दा है, को हल करने के लिए अपने समस्या है, यह have multiple versions of gcc on the same computer संभव है और फिर -v
विकल्प के माध्यम से साथ चलने के लिए gcc
का सही संस्करण निर्दिष्ट करने के लिए दूसरा विकल्प है। इसलिए 4.1.2 को अपने फेडोरा 18 मशीन पर एक शॉट देने का अच्छा विचार हो सकता है।
एक और ध्यान दें, यदि आप -v
विकल्प का उपयोग, लेकिन चलाने के लिए gcc
का एक संस्करण निर्दिष्ट नहीं करते हैं, तो आप (stderr उत्पादन पर) आदेशों संकलन के चरणों को चलाने के लिए मार डाला मिल जाएगा। यह देखने के लिए उपयोगी हो सकता है कि क्या हो रहा है और यदि प्रत्येक मशीन पर क्या हो रहा है के बीच कोई बड़ा अंतर है।
ठीक है, अब आपके प्रश्नों पर। हां, gcc
: के "संस्करण एक्स" पर संकलन के लिए झंडे हैं, शुरुआत के लिए __VERSION__
Predefined Macro है, यह आपको संस्करण संख्या के const char *
पर वापस थूक देगा। यह काफी उपयोगी हो सकता है, लेकिन जीसीसी प्रलेखन के रूप में कहा गया है:
आप इसकी सामग्री किसी विशेष रूप होने पर निर्भर नहीं होना चाहिए, लेकिन यह रिलीज संख्या
कम से कम शामिल करने के लिए पर गिना जा सकता है इसके बावजूद, मैंने आमतौर पर आउटपुट का केवल 1 रूप देखा है जो "4.6.3"
जैसा है यदि gcc
का मेरा संस्करण 4.6.3-1ubuntu5
है।
अब यदि आप जानते हैं (या संदिग्ध) है कि अपने कोड के कुछ gcc
का एक विशेष संस्करण का कारण होगा आप अपने आप को "रक्षा" के लिए __GNUC__
, __GNUC_MINOR__
, और __GNUC_PATCHLEVEL__
पूर्व-निर्धारित मैक्रो का उपयोग कर सकते करने के लिए त्रुटियों का कारण:
यहाँ एक है लघु स्निप-यह उच्चतम स्तर पर दिखा कि यह कैसे उपयोग करने के लिए:
#if __GNC__ == 3
printf(“Hello version 3.x.x\n”);
#elif __GNC__ == 4
printf(“Hello version 4.x.x\n”);
#endif
तो ऊपर प्रणाली है जहाँ संस्करण 4.6.3 आप "नमस्ते संस्करण 4.xx" संदेश दिखाई होता है पर। तो फिर तुम और अधिक उन्नत हो और subversions जांच करके यह भी कर सकते हैं:
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
या कि अपनी खुद की मैक्रो का उपयोग करने का क्लीनर संस्करण:
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION > 30200
printf(“I’m a gcc greater than 3.2.0\n”);
#endif
के विभिन्न संस्करणों अगर के बारे में आपके प्रश्न को हल करने के लिए gcc
विभिन्न त्रुटियों का उत्पादन करेगा, आप सही हैं कि gcc
की प्रत्येक रिलीज में और भी चल रहा है और कभी-कभी चीजें बदलती हैं ताकि आप कंपाइलर के विभिन्न संस्करणों के बीच अंतर देखेंगे। सबसे अच्छा शर्त यह है कि आप दोनों के बीच प्रत्येक संस्करण के लिए रिलीज नोट्स को जांचना है। (4.1 से 4.7 तक)।
मैं सुनिश्चित नहीं हूं आपके पास कौन सा लक्ष्य आर्किटेक्चर है, इसलिए सुनिश्चित करें कि आप प्रत्येक दस्तावेज़ में उन विशिष्ट अनुभागों की जांच करें। लेकिन मुझे लगता है कि आप वास्तव में "Build system improvements"
और "Incompatible changes to the build system"
पर एक नज़र रखना चाहते हैं, वे सी कोड के लिए विशिष्ट अनुभाग भी बनाते हैं जो समीक्षा के लिए आसान हो सकता है।
हां, विभिन्न कंपाइलर/संस्करण/झंडे विभिन्न परिणाम उत्पन्न कर सकते हैं, esp। 'if ifff-heavy कोड में। –
जहां तक 'भविष्य में इससे बचने के लिए मैं किसी भी झंडे को सेट कर सकता हूं', क्या मेरा उत्तर उस कवर को कवर करता है, या आप कुछ अलग सोच रहे थे? – Mike
कुछ उपयोगी जानकारी अच्छी होगी, कंपाइलर की तुलना में एक सिस्टम पर एक अतिरिक्त हेडर अलग होने की संभावना है, लेकिन आप कभी भी यह नहीं बताते कि channel.h या internal.h कहां हैं या वे कैसे शामिल हैं। आसपास के चारों ओर की रेखाएं जहां channel_t प्रकट होता है, कम से कम ifdefs के लिए भी उपयोगी होगा। आपका सीएफएलजी परिभाषित करता है कि इसके बिना बिल्कुल कुछ भी नहीं है। – technosaurus