2012-05-24 16 views
6

Ich habe über einige C++ Code kommen, die Folgendes hat:Hat ein typedef selbst Auswirkungen?

typedef Request Request; 

Ist das nur eine no-op oder tut dies typedef tatsächlich haben eine Wirkung, und wenn ja, hat sie, welche Auswirkungen?

+2

Wurde 'Request' in demselben Namespace definiert? –

+1

Das könnte etwas tun, wenn 'Request' ein Makro wäre. – Mankarse

+2

Sind Sie sicher, dass es nicht 'typedef struct Request Request' war? –

Antwort

9

Die Identität typedef ist zulässig, wenn der Name bereits auf einen Typ verweist.

Das ist legal:

typedef int Request; 
typedef Request Request; // Redefines "Request" with no effect 

Dies ist nicht:

typedef Request Request; // Illegal, first "Request" doesn't name a type. 

Der Standard hat ein spezielles Beispiel im Zusammenhang mit diesem. C++ 2003 §7.1.3/2:

In einem gegebenen Nicht-Klassenbereich, kann ein typedef Spezifizierer verwendet werden, um den Namen eines beliebigen Typs in erklärt, neu zu definieren, dass Umfang auf die Art beziehen sich auf worauf es sich schon bezieht. [Beispiel:

typedef struct s { /* ... */ } s; 
typedef int I; 
typedef int I; 
typedef I I; 

- Ende Beispiel]

+0

Was ist der Unterschied zwischen ihnen? Dein Beitrag ist nicht klar genug, da ich denselben typedef zweimal sehe, aber einer von ihnen ist legal, der andere nicht. – Nawaz

+0

Der Unterschied zwischen meinem ersten Block und meinem zweiten Block ist die vorherige Definition von "Request". –

0

WennRequest nur als Parameter übergeben es ein opaque pointer zu sein scheint.
Es sollte ein

typedef struct Request Request 

irgendwo im Code sein. (siehe Kommentare zu Ihrer Frage)
Dies wird verwendet, um eine API zu definieren und Implementierungsdetails auszublenden. Sie können später die Implementierung ändern, ohne die API erneut zu ändern.

Der Client muss nichts über den tatsächlichen Typ wissen - es ist nur eine Art Griff.
Alles, was Sie damit machen wollen, muss mit den API-Methoden erfolgen (Erstellen, Löschen, Laden, Init, ...)
Normalerweise wird das Handle Request zu etwas Sinnvoller in der Implementierung der API gegossen werden. Dies wurde/ist normalerweise in alt C.

Verwandte Themen