2012-05-24 8 views
6

me he encontrado con algo de código C++ que tiene las siguientes:¿Tiene un typedef en sí mismo algún efecto?

typedef Request Request; 

Se trata sólo de un no-op o hace este typedef real de tener un efecto, y si es así, ¿qué efecto tiene?

+2

¿Se definió 'Solicitud' en el mismo espacio de nombres? –

+1

Esto podría hacer algo si 'Solicitud' fuera una macro. – Mankarse

+2

¿Estás seguro de que no fue 'typedef struct Request Request'? –

Respuesta

9

La identidad typedef está permitida si el nombre ya se refiere a algún tipo.

Esto es legal:

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

Esto no es:

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

La norma tiene un ejemplo específico relacionado con este. C++ 2003, §7.1.3/2:

En un alcance no clase dada, un especificador typedef se puede utilizar para redefinir el nombre de cualquier tipo declarado en que alcance para referirse al tipo de al cual ya se refiere. [Ejemplo:

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

- ejemplo extremo]

+0

¿Cuál es la diferencia entre ellos? Su publicación no es lo suficientemente clara, ya que veo el mismo tipodef dos veces, sin embargo, una de ellas es legal, la otra no. – Nawaz

+0

La diferencia entre mi primer bloque y mi segundo bloque es la definición previa de "Solicitud". –

0

SiRequest solamente se pasa como un parámetro que parece ser un opaque pointer.
Debe haber un

typedef struct Request Request 

en alguna parte del código. (Consulte los comentarios sobre su pregunta)
Esto se usa para definir una API y ocultar detalles de implementación. Entonces puede cambiar la implementación más tarde sin cambiar la API nuevamente.

El cliente no necesita saber nada sobre el tipo acutal, es solo una especie de mango.
Todo lo que quieras hacer con él tiene que hacerse con los métodos api (creación, eliminación, carga, inicialización, ...)
Normalmente, el identificador Request se convertirá en algo más significativo en la implementación de la API. Esto fue/generalmente se hace en antiguo C.

Cuestiones relacionadas