typedef и непростые спецификаторы типов - PullRequest
18 голосов
/ 20 июля 2010

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

typedef int INT;
unsigned INT a=6;

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

typedef int INT;
static INT a=1; 

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

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

РЕДАКТИРОВАТЬ

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

Ответы [ 3 ]

29 голосов
/ 20 июля 2010

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

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

Итак, когда вы говорите typedef int INT;, тогда INT является полным именем типа.Его нельзя изменить.

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

12 голосов
/ 20 июля 2010
  • 7.1.1: static является спецификатором класса хранилища. Это может быть размещено до любой тип.
  • 7.1.5: что такое спецификатор типа (unsigned можно комбинировать с char, long, short или int)
2 голосов
/ 20 июля 2010

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

...