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코드가 아니기 때문입니다.

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.