2010-07-20 15 views
18

Dlaczego ten kod jest nieważny?Specyfikacja typedef i nietypowych typów

typedef int INT; 
unsigned INT a=6; 

natomiast następujący kod jest ważny

typedef int INT; 
static INT a=1; 

?

Zgodnie z moim zrozumieniem unsigned int nie jest "simple type specifier" i dlatego kod jest źle sformułowany. Nie jestem jednak pewien.

Czy ktoś może wskazać odpowiednią sekcję Standard, która powoduje, że pierwszy kod jest nieważny (a drugi kod jest prawidłowy)?

EDIT

Chociaż Johannes Schaub's odpowiedź wydawała się być prawidłowa, a do punktu (miał usunięte jego odpowiedź BTW) przyjąłem odpowiedź James Curran za jego poprawności i precyzji.

+0

Z ciekawości, dlaczego to zrobiłeś? Nie ma zbyt wiele powodów do tej redefinicji. 'typedef unsigned int UINT;' może mieć więcej sensu, chociaż ... – JAB

+1

Tak, JAB Wiem, że właściwie nigdy nie napisałbym takiego kodu praktycznie. Jednak jestem ciekawy, dlaczego pierwszy kod nie działa? Tak więc pytanie zostało również oznaczone jako "język-prawnik". –

+0

Wiem, że to nie jest główny temat, ale możesz napisać "std :: make_unsigned :: type" (zobacz http://msdn.microsoft.com/en-us/library/ee361636.aspx?ppud=4) – Tomaka17

Odpowiedz

29

typedef s nie są jak makra. Nie są one tylko substytutem tekstu. Typedef tworzy nową nazwę pliku.

Teraz, gdy mówisz unsigned int, unsigned nie jest modyfikatorem, który jest przyczepiony do int. unsigned int to pełna nazwa pliku; po prostu ma w sobie miejsce.

Tak więc, kiedy mówisz typedef int INT;, wtedy INT jest kompletną nazwą typu. Nie można go modyfikować.

static (jak const) to specyfikator klasy pamięci. To w rzeczywistości nie jest częścią nazwy typu.

+1

Standardowa sekcja C++ 0x 3.9.1 sekcja 3 zawiera listę typów całkowitych bez znaku i obsługuje twoją odpowiedź. 'unsigned int' to typ, który ma spację w nazwie. "unsigned" nie jest wymienione jako modyfikator innego typu, aby magicznie uczynić go nieujemnym. –

12
  • 7.1.1: static jest specyfikatorem klasy pamięci. Może być umieszczony przed dowolnym typem.
  • 7.1.5: jaka jest specyfikacja typu (unsigned można łączyć z char, długi, krótki, lub INT)
+3

'unsigned' może być także typem sam w sobie. – torak

+0

I kwalifikuje implicitely int typu – Scharron

+0

+1 nie do końca przemyślny, ale poprawny i jeśli ma jakąkolwiek wiedzę o standardese, podejrzewam, że te numery sekcji pomogą mu. –

2

Nie zapominaj, że wpisywanie nie przypomina definicji makr; w twoim przykładzie wydaje się, że jeśli uważasz, że twoje INT powinno być postrzegane jako literalne int. Z punktu widzenia kompilatora, typedef definiuje aliasy typów, ale nie jest to widoczne na poziomie "składni" (typowane typy są jak typy "natywne" na poziomie składni); a ponieważ na tym poziomie niepodpisany jest dozwolony przed zwarciem długim lub tylko int, twój unsigned INT jest postrzegany jako "typ" ("inny" od char, long, short, int) poprzedzony unsigned.