определение типа и непростые спецификаторы типа

Почему этот код недопустим?

typedef int INT;
unsigned INT a=6;

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

typedef int INT;
static INT a=1; 

?

Согласно моему пониманию unsigned int не a "simple type specifier" и таким образом, код плохо формируется. Я не уверен все же.

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

Править

Хотя ответ Johannes Schaub, казалось, был корректен и к точке (он удалил свой ответ BTW), я принял ответ James Curran для его правильности и точности.

18
задан Community 23 May 2017 в 10:34
поделиться

3 ответа

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

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

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

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

29
ответ дан 30 November 2019 в 06:54
поделиться
  • 7.1.1 : static - это спецификатор класса хранения. Он может быть помещен перед любым типом.
  • 7.1.5 : what является спецификатором типа (unsigned может сочетаться с char, long, short или int)
12
ответ дан 30 November 2019 в 06:54
поделиться

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

2
ответ дан 30 November 2019 в 06:54
поделиться