Спецификаторы типов C
Спецификаторы типа в объявлениях определяют тип объявления переменной или функции.
Синтаксис
type-specifier
: void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name
Типы signed char
, signed int
, signed short int
и signed long int вместе с аналогичными типами unsigned
и enum
совокупно именуются целочисленными типами. Описатели типов float
, double
и long double
называются типами с плавающей точкой или плавающей запятой. Любой спецификатор целочисленного типа или типа с плавающей запятой можно использовать в объявлении переменной или функции. Первоначально, если type-specifier
не было указано в объявлении, оно было принято int
. Компилятор Майкрософт больше не принимает объявления по умолчанию int
.
Необязательные ключевые слова signed
и unsigned
могут предшествовать или следовать любому из целочисленных типов, кроме того enum
, можно использовать только в качестве описателей типов, в этом случае они понимаются как signed int
и unsigned int
соответственно. Если ключевое слово int
используется отдельно, оно обрабатывается как signed
. Если ключевые слова long
и short
используются отдельно, они трактуются как long int и short int
.
Типы перечисления считаются базовыми типами. Описатели типов для типов перечисления рассматриваются в статье Объявления перечислений C.
Ключевое слово void
используется для трех целей: задание типа возвращаемого значения функции, задание списка типов аргументов для функции, не принимающей аргументов, и задание указателя на неуказанный тип. Тип void
можно использовать для объявления функций, не возвращающих никаких значений, или для объявления указателя на неуказанный тип. В статье Аргументы описано, как обрабатывается void
, если это единственное ключевое слово в скобках после имени функции.
Блок, относящийся только к системам Майкрософт
Проверка типов теперь соответствует требованиям ANSI, то есть типы short
и int
считаются разными типами. Например, в этом примере показана переопределение в компиляторе Microsoft C, принятом предыдущими версиями компилятора.
int myfunc();
short myfunc();
Следующий пример также создает предупреждение о косвенном обращении к разным типам:
int *pi;
short *ps;
ps = pi; /* Now generates warning */
Компилятор Microsoft C также выдает предупреждения в случае разного использования знака (типы со знаком и без знака). Например:
signed int *pi;
unsigned int *pu;
pi = pu; /* Now generates warning */
Выражения типа void
вычисляются для учета побочных эффектов. Не удается использовать (несуществующее) значение выражения, которое имеет тип void
каким-либо образом, не может быть преобразовано void
выражение (путем неявного или явного преобразования) в любой тип, кроме void
. При использовании в контексте, в котором требуется выражение void
, выражения любого другого типа его значение игнорируется.
Чтобы соответствовать спецификации ANSI, void**
нельзя использовать как int**
. В качестве указателя на неуказанный тип можно использовать только void*
.
Завершение блока, относящегося только к системам Майкрософт
Можно создать дополнительные описатели типов с typedef
объявлениями, как описано в объявлениях Typedef. Сведения о размерах для каждого типа см. в статье Хранение базовых типов.
См. также
Объявления и типы
typeof, __typeof__
(C23)
typeof_unqual, __typeof_unqual__
(C23)