Квалификаторы типа
Квалификатор типа (type qualifier) — одно из ключевых слов const, volatile или restrict в языках программирования семейства Си.
Синтаксис
Квалификаторы типов используются в нескольких синтаксических контекстах:
- В составе последовательности спецификаторов объявления: применяются к типу, который образуют спецификаторы типа в этой последовательности спецификаторов объявления. Например:
<source lang="C">const int *p; /* const применяется к типу указуемого объекта */</source>
- В составе декларатора указателя: применяются к соответствующему указательному типу. Например:
<source lang="C">int *restrict p; /* restrict применяется к типу указателя p */</source>
- В объявлении функции-члена в Си++: применяются к соответствующему типу функции. Например:
<source lang="cpp">class C { public:
int f() const; /* const-квалифицированная функция-член */
};</source>
Семантика
Квалификаторы типа применяются к типам l-выражений (в Си и Си++) и r-выражений классовых типов (в Си++), влияя на семантику доступа к объектам, на которые ссылаются эти выражения:
const-квалифицированный тип l-выражения, а также const-квалифицированные поля структур и объединений в Си и данные-члены классовых типов в Си++, являющихся типами l-выражений указывают на то, что такое l-выражение не является модифицируемым l-выражением, и значит объект, на который оно ссылается не может быть модифицирован через это l-выражение операциями инкремента, декремента, присваивания или вызовом не-const-квалифицированной функции-члена. Например:
<source lang="cpp">void f(const int *p) {
*p = 0; /* ОШИБКА: *p является немодифицируемым l-выражением типа const int */
}</source>
- квалификация (CV-квалификация) функций-членов в Си++ означает, что левая часть операции доступа к функции-члену в операции вызова функции-члена должна иметь (в случае доступа с помощью операции
.) или указывать на (в случае доступа с помощью операции ->) объектный тип, имеющий не бо́льшую квалификацию. Например:
<source lang="cpp">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() */
}</source>
restrict-квалификация указателей в C99 означает, что данные, на которые указывают такие указатели не указывают на пересекающиеся объекты. Эта информация позволяет компилятору безопасно применять некоторые специальные виды оптимизаций. Например, прототипы стандартных функцийmemcpyиmemmove, определенные в C99 отличаются:
<source lang="C">#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);</source>
Ссылки
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....