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