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-7.5.0/gcc/Qualifiers-implementation.html