Поделиться через


Квалификаторы типов

Квалификаторы типов предоставляют идентификатору одно из двух свойств. Квалификатор типа const объявляет объект как неизменяемый. Квалификатор типа volatile объявляет элемент, значение которого можно изменить допустимым образом с помощью средств, недоступных программе, в которой он находится, таких как выполняемый в данный момент поток.

Квалификаторы типов const и volatile могут использоваться в объявлении только один раз. Квалификаторы типов могут использоваться с любым описателем типа; однако они не могут находиться после первой запятой в объявлении нескольких элементов. Например, следующие объявления допустимы.

typedef volatile int VI;
const int ci;

Следующие объявления не допустимы.

typedef int *i, volatile *vi;
float f, const cf;   

Квалификаторы типов имеют смысл только при обращении к идентификаторам как к l-значениям в выражениях. Дополнительные сведения об l-значениях и выражениях см. в разделе Выражения l-значений и r-значений.

Синтаксис

  • квалификатор-типа:
    constvolatile

Ниже представлены допустимые объявления const и volatile.

int const *p_ci;       /* Pointer to constant int */
int const (*p_ci);     /* Pointer to constant int */
int *const cp_i;       /* Constant pointer to int */
int (*const cp_i);     /* Constant pointer to int */
int volatile vint;     /* Volatile integer        */

Если спецификация типа массива включает квалификаторы типов, определяется элемент, а не тип массива. Если спецификация типа функции включает квалификаторы, поведение не определено. Ни volatile, ни const не влияет на диапазон значений или арифметические свойства объекта.

В следующем списке приводится описание использования const и volatile.

  • Ключевое слово const можно использовать для изменения любого фундаментального или агрегатного типа, указателя на объект любого типа или typedef. Если элемент объявлен только с квалификатором типа const, считается, что он имеет тип const int. Переменную const можно инициализировать или поместить в область хранения, доступную только для чтения. Ключевое слово const полезно при объявлении указателей на const, поскольку для этого требуется, чтобы функция не изменяла указатель.

  • Компилятор предполагает, что в любом месте программы к переменной volatile можно получить доступ в ходе неизвестного процесса, в котором используется или изменяется ее значение. Следовательно, независимо от оптимизаций, указанных в командной строке, необходимо создать код для каждого назначения переменной volatile или ссылки на нее, даже если кажется, что это ничего не изменит.

    Если volatile используется отдельно, предполагается int. Описатель типа volatile можно использовать для предоставления надежного доступа к специальным адресам памяти. Используйте volatile с объектами данных, к которым можно получить доступ или которые можно изменить с помощью обработчиков сигналов, одновременного выполнения программ или специального оборудования, например регистров управления MMIO. Можно объявить переменную как volatile на протяжении ее времени жизни или привести одну ссылку ко значению volatile.

  • Элемент может быть и const, и volatile. В последнем случае элемент невозможно изменить допустимым образом в собственной программе, но можно изменить в некотором асинхронном процессе.

См. также

Основные понятия

Объявления и типы