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

Квалификатор типа ( англ. 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 указывает на то, что объявленная таким образом переменная может измениться независимо от действий программы. Смысл использования квалификатора заключается в том, что компиляторы могут оптимизировать код, использующий переменную без учёта возможности её изменения в силу внешних условий.

См. также

Источник —

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