Спецификаторы 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), я принял ответ Джеймса Каррана за его правильность и точность.
Ответы
Ответ 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
.