2010-12-02 3 views
7

Dans un code, j'ai vu récemment il y avait une structure définie comme ceci:Balise de structure et nom, pourquoi une variable locale déclarée comme nom compile?

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

La façon dont je comprends, tagMyStruct est le nouveau type de données et MYSTRUCT est une variable qui est créé là.

A un autre endroit, cela a été utilisé comme ceci:

MYSTRUCT *pStruct = new MYSTRUCT; 

et compilé fin avec Visual Studio 2010. Comment est-ce valide C++? Je pensais que MYSTRUCT était une variable et non un type?

Répondre

9

n ° tagMyStruct est le nom de la struct. En C, contrairement à C++, vous devez utiliser explicitement le mot-clé struct chaque fois que vous utilisez le type struct. Par exemple

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

Pour éviter struct écrire tout le temps, struct tagMyStruct est typedef « d à MYSTRUCT. Maintenant, vous pouvez écrire

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

Ce que vous pensiez que c'était (une définition variable) serait sans le mot-clé typedef, comme celui-ci

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

BTW

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

est pas valide C ou C++ quand même. Peut-être vous dire

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

HTH

+0

Oups, vous avez raison. J'ai raté cette esperluette là-bas. – bastibe

+1

@BastiBechtold: Ce n'est pas une esperluette. C'est un astérisque. Ampersand est & :) –

+0

Depuis quand 'new' est-il valide en C? Aussi, il est important de souligner que cette utilisation de 'typedef' est inutile et généralement une mauvaise idée en C++, car C++ ne nécessite pas d'utiliser le mot-clé' struct' comme partie du nom du type comme le fait C. (Bien que vous soyez parfois bloqué avec cela parce que vous interagissez avec le code C hérité.) –

3

Vous avez tord, vous utilisez typedef, c'est-à-dire MYSTRUCT est un alias pour tagMyStruct. Cela explique comment c'est correct C++.

Pour créer une variable, laisser tomber le typedef:

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

Ce sont les alias 'MYSTRUCT' et' tagMystruct' seulement en C++ pas en C –

5
struct tagMyStruct { ... }; 

définit un nouveau type C++ (classe) appelé tagMyStruct.

struct { ... } MYSTRUCT; 

définit une variable appelée MYSTRUCT avec la structure indiquée.

typedef struct { ... } MYSTRUCT; 

définit un typedef appelé MYSTRUCT qui est équivalent à la struct anonyme donnée.

typedef tagMyStruct struct { ... } MYSTRUCT; 

définit un typedef appelé MYSTRUCT et un type appelé tagMyStruct. Donc MYSTRUCT est juste un typedef pour tagMyStruct. Par conséquent, MYSTRUCT pStruct définit un tagMyStruct appelé pStruct.

L'affectation que vous avez indiquée n'est pas valide car new MYSTRUCT renvoie un pointeur à MYSTRUCT.

Questions connexes