エラーメッセージ:expression must be a modifiable lvalue

テクニカル・ノート 82120

アーキテクチャ:

All

コンポーネント:

compiler

更新日:

2018/01/17 8:51

はじめに

コードを別のバージョンのIAR C / C ++コンパイラに移動すると、次のメッセージが表示されることがあります:

Error[Pe137]: expression must be a modifiable lvalue

このメッセージは、キャストがlvalue (代入式の左辺で使用できる値)を生成しないために起こります。

ただし、*演算子でキャストされた式はlvalueを生成することができるので、次の式はエラーメッセージを発生しません:

void f (void * ptr)
{
*(long *)ptr = 0x11223344L;
}


エラーメッセージを回避する方法

There are a couple of ways to rework the code to avoid this error message.

最善策としては、可能であるならば、型を修正して最初の場所にキャストを置かないようにすることです。

代替の対策として、目的の型の一時変数を使用することもできます。

以下例はエラーが発生します:

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 および Annex B に Cの構文のを説明).

From ISO/ANSI 9899-1990 6.3.4, cast operators, footnote 44: "A cast does not yield an lvalue. [...]".

Annex 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システムズのコンパイラを含む多くのコンパイラは、代入式の左辺にキャスト式を置くことを認めています。IARは、C構文解析プログラムを変更して、ISO/ANSI の規格を外れているコードにより厳格になりました。

全ての製品名は、それぞれの所有者の商標または登録商標です

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。