2010-07-20 8 views
18

Warum ist dieser Code ungültig?typedef und nicht einfach Typdeklarierer

typedef int INT; 
unsigned INT a=6; 

während des folgenden Code gültig

typedef int INT; 
static INT a=1; 

?

Nach meinem Verständnis unsigned int ist kein "simple type specifier" und so ist der Code schlecht gebildet. Ich bin mir allerdings nicht sicher.

Kann jeder Punkt auf dem entsprechenden Abschnitt des Standard, die den ersten Code ungültig ist (und den zweiten Code gültig) macht?

EDIT

Obwohl Johannes Schaub's Antwort richtig und auf den Punkt zu sein schien (er hatte BTW seine Antwort gelöscht) Ich James Curran Antwort auf ihre Richtigkeit und Genauigkeit übernommen.

+0

Aus Neugier, warum würden Sie das tun? Es gibt nicht viel Grund für diese Neudefinition. 'typedef unsigned int UINT;' könnte jedoch mehr Sinn machen ... – JAB

+1

Ja JAB Ich weiß das, eigentlich würde ich solchen Code praktisch nie schreiben. Aber ich bin neugierig, warum funktioniert der erste Code nicht? Also wurde die Frage auch mit 'Sprachanwalt' getaggt. –

+0

Ich weiß, das ist nicht das primäre Thema, aber Sie können schreiben "std :: make_unsigned :: type" (siehe http://msdn.microsoft.com/en-us/library/ee361636.aspx?ppud=4) – Tomaka17

Antwort

29

typedef s sind keine Makros mögen. Sie sind nicht nur Textsubstitution. Ein Typedef erstellt einen neuen Typnamen.

Jetzt, wenn Sie unsigned int sagen, ist die unsigned kein Modifikator, der auf die int geheftet wird. unsigned int ist der vollständige Typname; Es ist einfach nur Platz drin.

Also, wenn Sie sagen typedef int INT; dann INT ist der vollständige Typname. Es kann nicht geändert werden.

static (wie const) ist ein Speicherklassenspezifizierer. Es ist nicht Teil des Typnamens.

+1

C++ 0x Standard Abschnitt 3.9.1 Absatz 3 listet die unsigned Integraltypen und unterstützt Ihre Antwort. 'unsigned int' ist ein Typ mit einem Leerzeichen im Namen. 'unsigned' wird nicht als Modifikator für einen anderen Typ aufgeführt, um ihn magisch nicht-negativ zu machen. –

12
  • 7.1.1: static ist ein Speicherklassenbezeichner. Es kann vor jeder Art von platziert werden.
  • 7.1.5: Was ist eine Typangabe (unsigned char mit kombiniert werden können, lang, kurz oder int)
+3

'unsigned' kann auch ein Typ sein. – torak

+0

Und qualifiziert implizit int Typ – Scharron

+0

+1 nicht sehr ausführlich, aber richtig und wenn er irgendwelche Kenntnisse von Standard hat, vermute ich, dass diese Abschnitt Zahlen ihm helfen. –

2

Vergessen Sie nicht, dass typedef-ing nicht Makro definiert, ist wie; In Ihrem Beispiel scheint es, als ob Sie denken, dass Ihr INT wie ein Literal gesehen werden sollte int. Aus Sicht des Compilers definiert Typdef Typ-Aliase, aber dies wird nicht auf "Syntax" -Ebene gesehen (typedef-ed-Typen sind wie "native" Typen auf der Syntax-Ebene); und da auf dieser Ebene unsigned vor char long short oder int nur erlaubt ist, wird Ihr unsigned INT als "Typ" ("anders" von char, long, short, int) gesehen, dem unsigned vorausgeht.