エラーメッセージ: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 の規格を外れているコードにより厳格になりました。
全ての製品名は、それぞれの所有者の商標または登録商標です