Квалификатор типа () — одно из зарезервированных слов const, volatile или restrict в языках программирования семейства Си.
Синтаксис
Квалификаторы типов используются в нескольких синтаксических контекстах: в составе последовательности спецификаторов объявления: применяются к объявляемому типу. Например: const int *p; /* const применяется к типу указываемого объекта */ при определении указателя: применяются к соответствующему указательному типу. Например: int *restrict p; /* restrict применяется к типу указателя p */ в объявлении функции-члена в Си++: применяются к соответствующему типу функции. Например: class C { public: int f() const; /* const-квалифицированная функция-член */
Семантика
Квалификаторы типа применяются к типам l-выражений (в Си и Си++) и r-выражений классовых типов (в Си++), влияя на семантику доступа к объектам, на которые ссылаются эти выражения: const-квалифицированный тип l-выражения, а также const-квалифицированные поля структур и объединений в Си и данные-члены классовых типов в Си++, являющихся типами l-выражений указывают на то, что такое l-выражение не является модифицируемым l-выражением, и значит объект, на который оно ссылается не может быть модифицирован через это l-выражение операциями инкремента, декремента, присваивания или вызовом не-const-квалифицированной функции-члена. Например: void f(const int *p) { *p = 0; /* ОШИБКА: *p является немодифицируемым l-выражением типа const int */ } квалификация (CV-квалификация) функций-членов в Си++ означает, что левая часть операции доступа к функции-члену в операции вызова функции-члена должна иметь (в случае доступа с помощью операции .) или указывать на (в случае доступа с помощью операции ->) объектный тип, имеющий не бо́льшую квалификацию. Например: class C { public: C(); int f() const; int g();
void f() { const C c; c.f(); /* OK: квалификации c и C::f() совпадают */ c.g(); /* ОШИБКА: квалификации c не достаточно для вызова C::g() */ } restrict-квалификация указателей в C99 означает, что указатели указывают на данные, которые не пересекаются в памяти (см. пересекающиеся объекты). Эта информация позволяет компилятору безопасно применять некоторые специальные виды оптимизаций. Например, прототипы стандартных функций memcpy и memmove, определенные в C99 отличаются: #include <string.h>
void *memcpy(void * restrict s1, /* копируемые области не должны пересекаться */ const void * restrict s2, size_t n);
void *memmove(void *s1, /* копируемые области могут пересекаться */ const void *s2, size_t n);
ключевое слово volatile указывает на то, что объявленная таким образом переменная может измениться независимо от действий программы. Смысл использования квалификатора заключается в том, что компиляторы могут оптимизировать код, использующий переменную без учёта возможности её изменения в силу внешних условий.
См. также Классы памяти
Категория:Типы данных Категория:Языки программирования Категория:Си (язык программирования) Категория:Статьи с примерами кода Си