2013-10-30 6 views
5

के साथ काम नहीं करता है मेरे पास कुछ विरासत कोड है जिसे आमतौर पर जीसीसी 3.4.4 के साथ पावरपीसी के लिए संकलित किया गया था। अब मैं कुछ कोड भागों को पोर्ट कर रहा हूं जिन्हें मैं मिनीजीडब्ल्यू से जीसीसी 4.8.1 के साथ संकलित करना चाहता हूं।यूआईटी 8 की रिडंडेंट कास्ट जीसीसी 4.8.1

// Prototypes 
void foo(uint8* pData); 
uint8 bar(); 

// Function 
void foo(uint8* pData) 
{ 
    (uint8) *(pData++) = bar(); // Original Code - Doesn't work with GCC 4.8.1 
    *(pData++) = bar();   // Works with GCC 4.8.1 
} 

अगर मैं जीसीसी 4.8.1 के साथ मूल कोड से लाइन संकलित करने के लिए चाहते हैं मैं lvalue required as left operand of assignment त्रुटि मिलती है: कोड में कुछ बिंदु पर मैं इस पाया। अगर मैं कास्ट ऑपरेटर से छुटकारा पाता हूं तो यह ठीक काम करता है। क्या कोई समझा सकता है कि यह क्यों है? क्या वह सिर्फ अनावश्यक नहीं है और इससे कोई फर्क नहीं पड़ता? और यह जीसीसी 3.4.4 के साथ क्यों काम कर रहा है?

+0

इस कलाकार का _purpose_ क्या है? यहां तक ​​कि आप उस कथन का उपयोग रावल्यू के रूप में भी करते थे, कम से कम कास्ट अभी भी अनावश्यक/अनावश्यक है। –

+0

@ फ्रैंकएच। यह विरासत कोड है - मैंने यह नहीं लिखा, इसलिए दुर्भाग्य से मैं आपको यह नहीं बता सकता कि कोड की इस पंक्ति के लिए प्रेरणा क्या थी। – Toby

उत्तर

6

कास्ट ऑपरेटर का परिणाम एक अंतराल नहीं है (आप इसे अस्थायी के रूप में सोच सकते हैं जिसमें मूल वस्तु के समान मूल्य है, लेकिन इसका एक अलग प्रकार है - यह सिर्फ एक अनाम नाम है जिसे आप ' टी परिवर्तन), तो आप इसे असाइन नहीं कर सकते हैं।

संपादित करें: यह क्यों जीसीसी 4.3 के साथ संकलित किया गया है: क्योंकि संकलक बहुत अनुमोदित है। इसके अलावा, मैंने चेतावनी सक्षम करने के साथ संकलित नहीं किया है, मुझे लगता है। gcc -Wall निम्न निदान जारी करता है:

quirk.c: In function ‘main’: 
quirk.c:8: warning: target of assignment not really an lvalue; 
    this will be a hard error in the future 
+0

लेकिन फिर यह जीसीसी 3.4.4 के साथ क्यों काम कर रहा है? – Toby

+3

@Toby मुझे नहीं पता, शायद एक बग, लेकिन ** यह निश्चित रूप से काम नहीं कर रहा है। ** –

+1

@Toby मैं केवल * अनुमान लगा सकता हूं कि अनुकूलन के कारण '(uint8) * (pData ++) = bar (); 'में परिवर्तित => बस '* (पीडीटा ++) = बार();' यह एक मान्य अभिव्यक्ति है। अतीत में मुझे भी लगता है [मेरे जीसीसी में इसी तरह की बग] (http://stackoverflow.com/questions/14860189/expressions-jii-and-jii-should-be-a-lvalue-error) 4.4 कंपाइलर (और पुराने- संस्करण) और जैसा कि मुझे पता है [मेरे प्रश्न पर टिप्पणियां] (http://stackoverflow.com/questions/14860189/expressions-jii-and-jii-should-be-a-lvalue-error#comment20830435_14860189) बग को संशोधित किया गया था @ जीसीसी 4.6 –

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