2010-07-20 3 views
18

Почему этот код недействителен?typedef и спецификаторы непростого типа

typedef int INT; 
unsigned INT a=6; 

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

typedef int INT; 
static INT a=1; 

?

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

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

EDIT

Хотя Johannes Schaub's ответ, казалось правильным и точки (он удалил свой ответ BTW) Я принял ответ Джеймс Каррен за его правильности и точности.

+0

Из любопытства, зачем вы это делаете? Не так уж много причин для этого переопределения. 'typedef unsigned int UINT;' может иметь больше смысла, хотя .... – JAB

+1

Да JAB Я знаю, что на самом деле я бы никогда не писал такой код практически. Однако мне любопытно, почему не работает первый код? Поэтому вопрос также был отмечен как «адвокат языка». –

+0

Я знаю, что это не основной вопрос, но вы можете написать «std :: make_unsigned :: type» (см. Http://msdn.microsoft.com/en-us/library/ee361636.aspx?ppud=4) – Tomaka17

ответ

29

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

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

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

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

+1

C++ 0x стандартный раздел 3.9.1 в пункте 3 перечислены неподписанные типы интегралов и поддерживается ваш ответ. 'unsigned int' - это тип, в котором есть пробел в имени. 'unsigned' не указан в качестве модификатора для другого типа, чтобы магически сделать его неотрицательным. –

12
  • 7.1.1: static является спецификатором класса хранения. Его можно разместить до любого типа.
  • 7.1.5: что является спецификатор типа (без знака может быть объединен с полукокса, длинные, короткие, или INT)
+3

'unsigned' также может быть типом само по себе. – torak

+0

И квалифицирует неявно тип int – Scharron

+0

+1 не совсем продуманный, но правильный, и если у него есть какие-либо знания стандартного, я подозреваю, что эти номера разделов помогут ему. –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^