皆さん、
この(忌まわしい)コードを考えてみましょう。
volatile unsigned long a[1];
unsigned long T;
void main(void)
{
a[0] = 0x6675636b; /* first access of a */
T = *a;
*(((char *)a) + 3) = 0x64; /* second access of a */
T = *a;
}
...質問:((char *)a)
揮発性ですか、それとも不揮発性ですか?
これはより大きな疑問を投げかけます:の2つのアクセスの間に依存関係があるべきですか?つまり、人間の常識ではあると言われていますが、C99標準では、揮発性のものは不揮発性のものをエイリアスしないとされています。したがって、((char *)a)
が不揮発性である場合、2つのアクセスはエイリアスせず、依存。
より正確には、C99 6.7.3(パラ5)は次のようになります。
「不揮発性修飾型の左辺値を使用して揮発性修飾型で定義されたオブジェクトを参照しようとした場合、動作は未定義です。」
では、型キャストするときa
、揮発性修飾子は適用されますか?