2013-10-30 7 views
5

Mam trochę starszego kodu, który był zwykle kompilowany dla PowerPC z GCC 3.4.4. Teraz przenoszę części kodu, które chcę skompilować z GCC 4.8.1 z MinGW. W pewnym momencie w kodzie znalazłem to:Redundant cast of uint8 nie działa z GCC 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 
} 

Jeśli chcę skompilować linię z oryginalnego kodu z GCC 4.8.1 pojawia się błąd lvalue required as left operand of assignment. Jeśli pozbędę się operatora obsady, działa dobrze. Czy ktoś może wyjaśnić, dlaczego tak jest? Czy ta obsada nie jest po prostu zbędna i czy i tak nie powinna mieć znaczenia? I dlaczego działa z GCC 3.4.4?

+0

Co to jest "cel" tej obsady? Nawet gdybyś użył tego stwierdzenia jako rwartości, obsada co najmniej wciąż jest zbędna/niepotrzebna. –

+0

@FrankH. Jest to starszy kod - nie napisałem tego, więc niestety nie mogę powiedzieć, jakie były motywacje dla tego wiersza kodu. – Toby

Odpowiedz

6

Wynik operatora rzutowania nie jest l-wartością (można go traktować jako tymczasowy, który ma taką samą wartość jak oryginalny obiekt, ale ma inny typ - jest to tylko nienazwana wartość, którą można " t zmiany), więc nie można do niego przypisać.

Edytuj:, dlaczego to skompilowane z GCC 4.3: ponieważ ten kompilator jest zbyt permisywny. Poza tym nie skompilowałeś się z włączonymi ostrzeżeniami. gcc -Wall wydaje następującą diagnozę:

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

Ale dlaczego działa z GCC 3.4.4? – Toby

+3

@Toby Nie wiem, może błąd, ale ** to na pewno nie powinno działać. ** –

+1

@Toby Mogę tylko * zgadnąć *, że z powodu optymalizacji '(uint8) * (pData ++) = bar (); 'przekonwertowane na => tylko' * (pData ++) = bar(); 'to poprawne wyrażenie. W przeszłości napotykam również na błąd kompilatora 4.4 (podobnego błędu w moim gcc) (http://stackoverflow.com/questions/14860189/expressions-jii-and-jii-should-be-a-lvalue-error) (i I jak wiem z [komentarzy do mojego pytania] (http://stackoverflow.com/questions/14860189/expressions-jii-and-jii-should-be-a-valvalue-error#comment20830435_14860189) błąd został naprawiony @ GCC 4.6 –