typedef enum kesako?

typedef enum kesako? - C++ - Programmation

Marsh Posté le 27-09-2002 à 09:50:21    

Bonjour à tous,  
 
Il n'y a pas si longtemps que je me suis (re)mis au C et j'aimerais connaître toutes les nuances de l'instruction suivante :  
...
   typedef enum { SPOOL, PRINT, OFFLINE } MODE;
...
 
Je comprend les instructions 'typedef' et 'enum' séparément mais quand on les utilises ensemble je suis troublé:
 
1) est-ce une déclaration ( qui n'utilise pas de mémoire) ou une définition ( qui prend de la place mémoire).  
 
2) quel type de variable générique sera utilisé finalement (manifestement c'est un type int)
 
Quand on déclare une variable de type MODE comme dans :
...
       MODE iMode;        
...
Est-il sous-entendu qu' iMode ne peut prendre une autre valeur que ceux repris dans l'enum? Donc :
...
       iMode = SPOOL; // c'est Ok
       iMode = 99;    // ca donne une erreur à la compil???
 
Est-ce qu'il y a d'autres effets secondaires auquel je n'ai pas pensé?
 
Merci de m'éclairer à ce sujet. Avander.


Message édité par avander le 27-09-2002 à 09:54:45

---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 27-09-2002 à 09:50:21   

Reply

Marsh Posté le 27-09-2002 à 10:04:11    

En faisant ça tu déclare un nouveau type qui s'appelle MODE.
Le compilateur le verra comme un type au meme titre que int ou char.
iMode = 99; Comme la régle des enum s'applique à MODE, çane plantera pas mais ce n'est pas terrible.


---------------
The best way to accelerate a computer running windows is at 9.8m.s-2
Reply

Marsh Posté le 28-09-2002 à 02:14:55    

Code :
  1. enum MODE { SPOOL };
  2. enum MODE test1  ; //instance enum
  3.      MODE test2  ; //erreur de compilation
  4. typedef enum MODE MODE_t; //'enum MODE' est le type, 'MODE_t' le synonyme
  5. enum MODE_t test3; //incorrect, mais ça passe ?
  6. MODE_t test4     ; //instance typedef


Code :
  1. typedef enum MODE { SPOOL } MODE_t; //crée l'énumération et le synonyme en même temps
  2. typedef enum      { SPOOL } MODE_t; //idem, le nom de l'enum est optionnel


Code :
  1. enum MODE { SPOOL };
  2. typedef enum MODE MODE; //typedef et enum de même noms, on a le droit
  3. typedef enum MODE { SPOOL } MODE; //forme groupée  
  4. enum MODE test5; //instance enum
  5.      MODE test6; //instance typedef

Ça marche pareil avec struct.
Il est courant de voir:

Code :
  1. typedef struct Node{
  2. struct Node* pnext; //typedef pas encore dispo
  3. }Node; //typedef 'Node' synonyme de 'struct Node'
  4. struct Node node1; //on peut toujours faire comme ça...
  5.        Node node2; //...mais plus besoin de s'embêter !


1)
C'est une définition d'une enum et d'un typedef en même temps, mais ces définitions-là ne génèrent pas de code compilé: pas d'allocation.
 
2)
En C c'est un int.
En C++, c'est un type intégral 'suffisamment grand'.
 
3)
En C iMode = 99; est accepté, malheureusement.
En C++, il faut un cast: iMode = (MODE)99;. Il est question d'accepter la règle du C par compatibilité.
Dans les deux cas, c'est pas une bonne façon de programmer.
 
 
Je pense que j'ai rien oublié.
N'hésites pas à demander des précisions au besoin.
 

Combi_A_Vendre a écrit a écrit :

The best way to accelerate a computer running windows is at 9.8m.s-2


Non ! Je resiste à la tentation (je l'ai acheté avec mon pognon).


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed