Utiliser typedef enum en C

Jinku Hu 12 octobre 2023
  1. Utiliser enum pour définir des constantes entières nommées en C
  2. Utiliser typedef enum pour définir le type de client pour les objets contenant des constantes entières nommées
Utiliser typedef enum en C

Cet article présente plusieurs méthodes pour utiliser typedef enum en C.

Utiliser enum pour définir des constantes entières nommées en C

Le mot-clé enum définit un type spécial appelé énumération. Les énumérations sont essentiellement des valeurs intégrales qui ont des noms comme variables mais sont des objets en lecture seule et ne peuvent pas être modifiées à l’exécution.

Il y a deux façons de construire un objet enum ; l’une consiste à déclarer chaque membre sans lui attribuer de valeur explicite mais en déduisant automatiquement des valeurs en fonction de la position ; l’autre consiste à déclarer les membres et à leur attribuer des valeurs explicites.

Dans l’exemple ci-dessous, nous attribuons des valeurs personnalisées à chacun d’eux et nous avons nommé l’objet - STATE. Ensuite, nous pouvons utiliser les noms des membres de l’objet STATE dans le code comme des entiers signés et les évaluer dans des expressions. L’exemple de code suivant montre les multiples déclarations conditionnelles qui vérifient si l’entier en entrée est égal à la constante définie et impriment la chaîne de caractères appropriée correspondante une fois qu’elle est appariée.

#include <stdio.h>
#include <stdlib.h>

enum STATE { RUNNING = 49, STOPPED = 50, FAILED = 51, HIBERNATING = 52 };

int main(void) {
  int input1;

  printf("Please provide integer in range [1-4]: ");
  input1 = getchar();

  if (input1 == STOPPED) {
    printf("Machine is stopped\n");
  } else if (input1 == RUNNING) {
    printf("Machine is running\n");
  } else if (input1 == FAILED) {
    printf("Machine is in failed state\n");
  } else if (input1 == HIBERNATING) {
    printf("Machine is hibernated\n");
  }

  exit(EXIT_SUCCESS);
}

Production :

Please provide integer in range [1-4]: 2
Machine is stopped

Utiliser typedef enum pour définir le type de client pour les objets contenant des constantes entières nommées

Le mot-clé typedef est utilisé pour nommer les objets définis par l’utilisateur. Les structures doivent souvent être déclarées plusieurs fois dans le code. Sans les définir à l’aide de typedef, chaque déclaration devrait commencer par le mot-clé struct/enum, ce qui rend le code assez surchargé pour la lisibilité.

Notez cependant que typedef crée simplement un nouveau nom d’alias pour le type donné plutôt que de créer un nouveau type. Beaucoup de types d’entiers comme size_t, uint et d’autres sont juste des typedef d’autres types intégrés. Ainsi, l’utilisateur peut déclarer plusieurs noms d’alias pour des types intégrés et ensuite enchaîner des déclarations typedef supplémentaires en utilisant des alias déjà créés.

#include <stdio.h>
#include <stdlib.h>

typedef enum {
  RUNNING = 49,
  STOPPED = 50,
  FAILED = 51,
  HIBERNATING = 52
} MACHINE_STATE;

int main(void) {
  int input1;
  MACHINE_STATE state;

  printf("Please provide integer in range [1-4]: ");
  input1 = getchar();
  state = input1;

  switch (state) {
    case RUNNING:
      printf("Machine is running\n");
      break;
    case STOPPED:
      printf("Machine is stopped\n");
      break;
    case FAILED:
      printf("Machine is in failed state\n");
      break;
    case HIBERNATING:
      printf("Machine is hibernated\n");
      break;
    default:
      break;
  }

  exit(EXIT_SUCCESS);
}

Production :

Please provide integer in range [1-4]: 2
Machine is stopped
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook