2010-12-02 15 views
7

En algún código que vi hace poco no existía una estructura definida de esta manera:Etiqueta de estructura y nombre, ¿por qué se declara una variable local como compilación de nombre?

typedef struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 

mi modo de entender esto, tagMyStruct es el nuevo tipo de datos y MYSTRUCT es una variable que se crea allí mismo.

En otro lugar, esto se usó como esto:

MYSTRUCT *pStruct = new MYSTRUCT; 

y compila bien con Visual Studio 2010. ¿Cómo es que C++ válida? Pensé que MYSTRUCT era una variable y no un tipo?

Respuesta

9

No. tagMyStruct es el nombre de la estructura. En C, a diferencia de C++, debe usar explícitamente la palabra clave struct cada vez que use el tipo de estructura. Por ejemplo

tagMyStruct x; //error 
struct tagMyStruct x; //OK 

para evitar escribir struct todo el tiempo, struct tagMyStruct es typedef 'd a MYSTRUCT. Ahora se puede escribir

MYSTRUCT x; //ok, same as struct tagMyStruct x; 

lo que pensó que esto era (una definición de variable) sería sin la palabra clave typedef, como este

struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 

Por cierto

MYSTRUCT pStruct = new MYSTRUCT; //error cannot convert MYSTRUCT* to MYSTRUCT 

no es C válida o C++ de todos modos. Tal vez quiere decir

MYSTRUCT* pStruct = new MYSTRUCT; //valid C++ (invalid C - use malloc instead of new in C) 

hth

+0

Vaya, tiene usted razón. Me perdí ese ampersand allí. – bastibe

+1

@BastiBechtold: No es un signo comercial. Es un asterisco. Ampersand is & :) –

+0

¿Desde cuándo es 'nuevo' válido en C? Además, vale la pena enfatizar que este uso de 'typedef' es innecesario y generalmente una mala idea en C++, exactamente porque C++ no requiere que use la palabra clave' struct' como parte del nombre de tipo de la forma en que lo hace C. (Aunque a veces estás atrapado porque estás interoperando con el código C heredado). –

3

Usted está equivocado, está usando typedef, es decir MYSTRUCT es un alias de tagMyStruct. Esto explica cómo es correcto C++.

el fin de crear una variable, dejar caer el typedef:

struct tagMyStruct { 
    int numberOne; 
    int numberTwo; 
} MYSTRUCT; 
+0

Estos son alias 'MYSTRUCT' y' tagMystruct' solo en C++ no en C –

5
struct tagMyStruct { ... }; 

define un nuevo tipo de C++ (clase) llama tagMyStruct.

struct { ... } MYSTRUCT; 

define una variable llamada MYSTRUCT con la estructura propuesta.

typedef struct { ... } MYSTRUCT; 

define un typedef llamado MYSTRUCT que es equivalente a la struct anónimo dado.

typedef tagMyStruct struct { ... } MYSTRUCT; 

define un typedef llamado MYSTRUCT y un tipo llamado tagMyStruct. Entonces MYSTRUCT es solo un typedef para tagMyStruct. Por lo tanto, MYSTRUCT pStruct define un tagMyStruct llamado pStruct.

La asignación que diste no es válido, ya que new MYSTRUCT devuelve un puntero -MYSTRUCT.

Cuestiones relacionadas