Поделиться через


Спецификаторы типов C

Спецификаторы типа в объявлениях определяют тип объявления переменной или функции.

Синтаксис

type-specifier: voidcharshortintlongfloatdoublesignedunsignedstruct-or-union-specifierenum-specifiertypedef-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)