Подтвердить что ты не робот

Спецификаторы typedef и non-simple type

Почему этот код недействителен?

typedef int INT;
unsigned INT a=6;

тогда как следующий код действителен

typedef int INT;
static INT a=1; 

?

В соответствии с моим пониманием unsigned int не является "simple type specifier", поэтому код плохо сформирован. Я не уверен, хотя.

Может ли кто-нибудь указать на соответствующий раздел Standard, который делает первый код недействительным (и второй код действителен)?

ИЗМЕНИТЬ

Хотя ответ Йоханнеса Шауба, казалось, был правильным и точным (он удалил свой ответ BTW), я принял ответ Джеймса Каррана за его правильность и точность.

4b9b3361

Ответ 1

typedef не похожи на макросы. Это не просто замена текста. В Typedef создается новое имя.

Теперь, когда вы говорите unsigned int, unsigned не является модификатором, который привязан к int. unsigned int - это полное имя; это просто имеет место в нем.

Итак, когда вы говорите typedef int INT;, тогда int - это полное имя. Он не может быть изменен.

static (например, const) является спецификатором класса хранения. На самом деле это не часть имени типа.

Ответ 2

  • 7.1.1: static - это спецификатор класса хранения. Его можно разместить до любого типа.
  • 7.1.5: что такое спецификатор типа (unsigned может быть объединен с char, long, short или int)

Ответ 3

Не забывайте, что typedef-ing не похож на макроопределение; в вашем примере, похоже, если вы думаете, что ваш INT должен рассматриваться как буквальный int. С точки зрения компилятора typedef определяет типы псевдонимов, но это не видно на уровне "синтаксиса" (типы typedef-ed похожи на "родные" типы на уровне синтаксиса); и поскольку на этом уровне без знака допускается до char длинного короткого или только int, ваш unsigned INT рассматривается как "тип" ( "другой" из char, long, short, int), которому предшествует unsigned.