22

次のコードを検討してください。

int main()                                                                      
{                                                                             
    int i;                                                                      
    volatile int* p = &i;                                                       
    int *v = p;                                                                 
    return 0;                                                                   
}

これにより、次のエラーが発生しg++ます。

$ g++ -o volatile volatile.cpp 
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’

p私の意図は、揮発性にしたいということでした。ただし、の値を読み取った後は、アクセスが揮発性であるpかどうかは関係ありません。なぜ揮発性であると宣言vする必要があるのですか?v

もちろん、これは架空のコードです。p実際の状況では、それはメモリの場所を指していると想像できますが、外部で変更されているので、後で外部で変更されたとしても、その時点で指してvいた場所を指したいと思います。したがって、揮発性ですが、そうではありません。pv = pppv

ちなみに、これがCとC ++の両方と見なされる場合の動作に関心がありますが、Cでは、これは警告のみを生成し、エラーは生成しません。

4

2 に答える 2

36

ポインタが指すオブジェクトではなく、ポインタを揮発性にする必要がある場合は、次のように宣言します。

int* volatile p;
于 2010-03-19T14:50:13.777 に答える
14

C ++では、volatileキーワードは、実行できることに対して同じ種類の制限を適用しますconst。規格では、これを「const/volatilequalification」のように「cv-qualification」と呼んでいます。Constsはconstsのみが使用でき、ほとんど同じようにvolatilesはvolatilesのみが使用できます。

余談ですが、これはマルチスレッドコードの記述に役立ちます。変数を突然アトミックにするコンパイラの魔法などを使用するのではなく、揮発性のデータに対してのみ揮発性の方法で動作するように強制することによって。詳細については、このAlexandrescuの記事を参照してください。

于 2010-03-19T14:52:12.600 に答える