4.10 Квалификаторы
- Что считается доступом к объекту, имеющему тип с квалификатором volatile (C90 6.5.3, C99 и C11 6.7.3).
Такой объект обычно адресуется через указатели и используется для доступа к аппаратуре. В большинстве выражений интуитивно понятно, что такое чтение, а что такое запись. Например
volatile int *dst = somevalue; volatile int *src = someothervalue; *dst = *src;
вызовет чтение объекта volatile, на который указывает src, и сохранит значение в объект volatile, на который указывает dst. Нет гарантии, что эти чтение и запись являются атомными, особенно для объектов размером больше
int.Однако, если хранилище volatile не изменяется и значение хранилища volatile не используется, ситуация менее очевидна. Например
volatile int *src = somevalue; *src;
Согласно стандарту C, такое выражение является rvalue, тип которого является неквалифицированной версией его исходного типа, т.е.
int. Будет ли GCC интерпретировать это как чтение volatile объекта, на который указывает указатель, или только как запрос на вычисление выражения для его побочных эффектов, зависит от этого типа.Если это скалярный тип, или на большинстве целей агрегатный тип, единственный член объекта которого имеет скалярный тип, или тип объединения, члены объектов которого имеют скалярные типы, то выражение интерпретируется GCC как чтение volatile объекта; в других случаях выражение вычисляется только для побочных эффектов.
Когда объект агрегатного типа, с тем же размером и выравниванием, что и скалярный тип
S, является объектом доступа volatile оператором присваивания или атомной функцией, доступ к нему выполняется так, как если бы тип объявленного объекта былvolatile S.
Далее: Реализация деклараторов, Предыдущее: Реализация структур, объединений, перечислений и битовых полей, Наверх: Реализация C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Qualifiers-implementation.html