Expression must be a modifiable lvalue 에러 메시지
기술노트 82120
아키텍처:
All
컴포넌트:
compiler
업데이트:
2021-05-12 오전 10:05
소개
다른 버전의 IAR C/C++ 컴파일러로 코드를 옮기면, 다음의 에러 메시지가 발생할 경우가 있습니다:
Error[Pe137]: expression must be a modifiable lvalue
이런 메시지가 발생하는 이유는 형변환은 lvalue
를 생성하지 않기 때문에 발생합니다. (lvalue
; 대입구문에서 왼쪽에 사용되는 값)
반면 * 연산자를 사용한 형변환 구문은 lvalue
를 생성합니다, 따라서 다음의 예제는 문제가 없습니다.
void f (void * ptr)
{
*(long *)ptr = 0x11223344L;
}
에러 메시지를 없애는 방법
에러 메시지를 피하기 위해 코드를 재작업하는 몇 가지 방법이 있습니다.
가능하다면, 형변환이 처음부터 나타나지 않도록 자료형에 대해 재작업을 하는 것이 가장 좋은 방법입니다.
또는 원하는 자료형의 임시 변수를 사용하는 것입니다.
다음은 실패한 예제입니다:
void f (void *ptr)
{
((short *)ptr)++; // error
}
다시 작성하면 다음과 같습니다:
void f (void *ptr)
{
short *temp = ptr;
temp++;
ptr = temp;
}
기술적인 세부사항
형변환은 lvalue를 생성하지 않기 때문에 이러한 문제가 발생합니다. (ISO/ANSI 9899-1990 6.3.4 and Annex B which describes the syntax of C).
ISO/ANSI 9899-1990 6.3.4의, cast operators, 각주 44: "A cast does not yield an lvalue. [...]".를 살펴보시기 바랍니다.
부록 B 의 발췌문은 다음과 같습니다:
unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
unary-operator: one of
& * + - ~ !
cast-expression:
unary-expression
( type-name ) cast-expression
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
assignment-expression:
conditional-expression
unary-expression assignment-operator assignment-exression
assignment-operator: one of
= *= /= %= += -= <<= >>= &= ^= |=
대입의 왼쪽에는 단항식이 필요합니다. 형변환식은 단항식이 아닙니다. 상기에 언급했듯이, 단항식을 얻기 위해서는 형변환식 전에 (*와 같은) 단항 연산자를 사용해야 합니다.
일부 IAR Systems 제품들을 포함한, 많은 컴파일러들은 대입의 왼쪽에 형변환식을 허용합니다. 이후, 이 부분에 대해 더 제한하는 C 파서로 전환하였습니다. 이것은 적절한 ISO/ANSI C코드가 아니기 때문입니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.