Ist typedef nur ein String-Ersatz im Code oder etwas anderes?

8

Ich war neugierig zu wissen, wie genau Typedef funktioniert.

%Vor%

In der obigen Anweisung ist 'Bezeichner' nur ersetzt (etwas wie String-Ersetzung) mit 'struct Beispiel' im Code? Wenn nein, was macht Typedef hier?

bitte erleuchten!

    
KedarX 16.07.2010, 08:47
quelle

8 Antworten

32

Nein, das ist kein String-Ersatz - das wären Makros. Es erstellt einen Alias ​​für den Typ.

typedefs werden gegenüber Makros bevorzugt für benutzerdefinierte Typen, teilweise weil sie die Zeigertypen korrekt codieren können.

p> %Vor%
  

s1, s2 und s3 werden alle als char * deklariert, aber s4 wird als char deklariert, was wahrscheinlich nicht die Absicht ist.

    
Amarghosh 16.07.2010, 08:58
quelle
9

A typedef führt ein Synonym für Typen ein. Es ist kein einfacher String-Ersatz, wie das folgende zeigt:

%Vor%

Der Compiler ist sich auch bewusst, dass es sich um einen Typnamen handelt. Sie können ihn nicht einfach irgendwo platzieren, wo ein Typ nicht erlaubt ist, ohne einen Compilerfehler zu bekommen.

    
Georg Fritzsche 16.07.2010 08:57
quelle
5

Alle stimmen darin überein, dass es keine Typensubstitution ist, und dass es viel besser ist, als wenn Zeiger in den Mix kommen, aber es gibt auch andere Feinheiten. Insbesondere die Verwendung von typedefs kann die Analyse von Code und die Gültigkeit von Programmen beeinflussen.

Sowohl in C als auch in C ++ werden benutzerdefinierte IDs in verschiedenen Namensräumen gespeichert (nicht im C ++ Sinn, sondern in irgendeiner Art von Identifier-Space). Wenn Sie das Schlüsselwort typedef verwenden, erstellen Sie einen Alias ​​für den Typ im globalen -Namensraum , in dem sich Funktionen befinden.

%Vor%

Ein kleiner Unterschied ist hier, dass der Compiler in C ++ zuerst in den globalen Namensraum hineinschaut und wenn er dort nicht gefunden wird, wird er auch in den Namensraum des Typen schauen:

%Vor%

Dies bedeutet jedoch nicht, dass die beiden Namespaces zusammengeführt werden, sondern nur, dass die Suche an beiden Stellen erfolgt.

    
quelle
2

Eine wichtige Unterscheidung ist, dass typedef s scope hat.

Das Folgende ist ein gängiges Idiom

%Vor%

Häufig würde die Konstruktordefinition in einer CPP-Datei mit der Deklaration im Header enthalten sein. Wenn Sie Foo(int x) : Bar(x) verwenden, besteht eine gute Chance, dass Sie vergessen, den Konstruktor zu aktualisieren, wenn Sie die Klassenhierarchie so ändern, dass Foo- & gt; Wibble- & gt; Bar statt Foo- & gt; Persönlich empfehle ich, das 'geerbte' typedef zu jeder Unterklasse hinzuzufügen.

Siehe hier für weitere Details: Verwenden von "super" in C ++

    
Roddy 16.07.2010 09:56
quelle
0

Typedef ist eine Abkürzung, die einen neuen Namen für den (normalerweise komplexen) Typ erzeugt. Sein Zweck ist enger als der Stringersatz des Präprozessors. Daher ist es weniger fehleranfällig als Präprozessor-Definitionen (die rekursiv analysiert werden).

    
alxx 16.07.2010 08:51
quelle
0

Mit typedef erstellen Sie einen Alias. Der Compiler ersetzt den Alias ​​durch den korrekten Code.

Wenn Sie schreiben:

%Vor%

Der Compiler bekommt:

%Vor%     
Victor Marzo 16.07.2010 08:53
quelle
0

Makros werden vom Präprozessor erstellt und basieren ausschließlich auf Textersetzung. Man könnte also sagen, dass sie ziemlich dumm sind. Der Präprozessor akzeptiert so ziemlich jeden Müll ohne Syntaxprüfung.

Typedefs werden vom Compiler selbst ausgeführt und sie bearbeiten die eigene Typentabelle des Compilers, indem sie einen von Ihnen definierten abgeleiteten Typ hinzufügen. Dies unterliegt einer vollständigen Syntaxprüfung und einem Mechanismus speziell für Typen.

Sie könnten sich vorstellen, dass der Compiler ähnliche "Arbeit" leistet, wenn Sie eine struct deklarieren. Es gibt dort eine Definition, und der Compiler verwandelt sie in einen Typ in ihrer Typenliste.

    
Carl Smotricz 16.07.2010 08:59
quelle
0

Ich finde typedefs machen Funktionssignaturen viel einfacher zu lesen. Angenommen, Sie möchten einen Zeiger auf ein zweidimensionales Array zurückgeben. Hier ist der lesbare Weg:

%Vor%

Und so können Sie es ohne typedef machen:

%Vor%

Beachten Sie, dass diese Signatur nicht so aussieht wie die erste Version, bei der ein "String-Ersatz" angewendet wurde.

Wenn die C-Deklaratorsyntax nicht so hässlich war (Stroustrup: "Ich betrachte die C-Deklaratorsyntax als einen Versuch, der fehlschlug"), würde typedefs wahrscheinlich nicht so oft verwendet werden wie jetzt.

    
fredoverflow 16.07.2010 10:50
quelle

Tags und Links