Interested Article - Квалификаторы типа
lorelei
- 2021-08-11
- 1
Квалификатор типа
(
англ.
type qualifier
) — одно из
зарезервированных слов
const
,
volatile
или
restrict
в
языках программирования
семейства
Си
.
Синтаксис
Квалификаторы типов используются в нескольких синтаксических контекстах:
- в составе последовательности : применяются к объявляемому типу. Например:
const int *p; /* const применяется к типу указываемого объекта */
- при : применяются к соответствующему указательному типу. Например:
int *restrict p; /* restrict применяется к типу указателя p */
- в объявлении функции-члена в Си++ : применяются к соответствующему типу функции. Например:
class C {
public:
int f() const; /* const-квалифицированная функция-член */
};
Семантика
Квалификаторы типа применяются к типам (в Си и Си++) и (в Си++), влияя на семантику доступа к объектам , на которые ссылаются эти выражения:
-
const
-квалифицированный тип l-выражения, а также const-квалифицированные поля структур и объединений в Си и классовых типов в Си++, являющихся типами l-выражений указывают на то, что такое l-выражение не является , и значит объект, на который оно ссылается не может быть модифицирован через это l-выражение операциями инкремента , декремента , или вызовом не-const
-квалифицированной функции-члена. Например:
void f(const int *p)
{
*p = 0; /* ОШИБКА: *p является немодифицируемым l-выражением типа const int */
}
-
квалификация (
) функций-членов в Си++ означает, что левая часть операции доступа к функции-члену в операции вызова функции-члена должна иметь (в случае доступа с помощью операции
.
) или указывать на (в случае доступа с помощью операции->
) объектный тип, имеющий . Например:
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
указывает на то, что объявленная таким образом переменная может измениться независимо от действий программы. Смысл использования квалификатора заключается в том, что компиляторы могут оптимизировать код, использующий переменную без учёта возможности её изменения в силу внешних условий.
См. также
lorelei
- 2021-08-11
- 1