Рассмотрите следующий код:
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
указать на местоположение на это p
указанный во время v = p
, даже если позже p
внешне изменяется. Поэтому p
энергозависимо, но v
не.
По тому, как я интересуюсь поведением и когда это считают C и C++, но в C это только генерирует предупреждение, не ошибку.
Если вы имеете в виду, что указатель должен быть волатильным, а не объект, на который он указывает, то объявите его как
int* volatile p;
В C++ ключевое слово volatile
накладывает такие же ограничения на то, что вы можете делать, как и const
. В стандарте это называется "cv-квалификация", то есть "квалификация const/volatile". Константы могут быть использованы только констами, и точно так же летучие могут быть использованы только летучими.
Просто в качестве дополнения, это может помочь вам в написании многопоточного кода. Не в силу использования магии компилятора, которая делает вашу переменную внезапно атомарной или что-то в этом роде, а заставляя вас действовать с изменчивыми данными только изменчивым способом. См. статью Alexandrescu для получения дополнительной информации.