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

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Квалификатор типа (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-выражений классовых типов (в Си++), влияя на семантику доступа к объектам, на которые ссылаются эти выражения:

<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>


Ссылки

en:C_variable_types_and_declarations#Type_qualifiers

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....