Почему этот код недопустим?
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 для его правильности и точности.
typedef
не похожи на макросы. Это не просто подмена текста. Typedef создает новое имя типа.
Теперь, когда вы говорите unsigned int
, unsigned
не является модификатором, который прикреплен к int
. unsigned int
- полное имя типа; в нем просто есть место.
Итак, когда вы говорите typedef int INT;
, тогда INT
- это полное имя типа. Это не может быть изменено.
static
(например, const
) - спецификатор класса хранения. На самом деле это не часть имени типа.
Не забывайте, что определение типа не похоже на определение макроса; в вашем примере кажется, что если вы думаете, что ваш INT должен выглядеть как литерал int
. С точки зрения компилятора typedef определяет псевдонимы типов, но это не видно на уровне «синтаксиса» (типы typedef-ed похожи на «собственные» типы на уровне синтаксиса); и поскольку на этом уровне unsigned разрешено только перед char long short или int, ваш unsigned INT
рассматривается как «тип» («отличный» от char, long, short, int), которому предшествует беззнаковый
.