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; в других случаях выражение вычисляется только для побочных эффектов.
Далее: Реализация деклараторов, Предыдущее: Реализация структур, объединений, перечислений и полей битов, Наверх: Реализация C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Qualifiers-implementation.html