Déclaration et principe fondamental
À l'instar des structures, une union regroupe plusieurs membres pouvant être de types distincts. La particularité majeure réside dans le fait que le compilateur alloue uniquement la mémoire nécessaire au membre le plus volumineux. Tous les membres partagent donc la même zone mémoire, d'où l'appelllation alternative « type partagé ».
Modifier la valeur d'un membre impacte immédiatement tous les autres membres, puisqu'ils occupent le même espace adressable.
Calcul de la taille d'une union
Deux règles régissent le calcul :
- La taille minimale correspond à celle du membre le plus grand.
- Si cette taille n'est pas un multiple de l'alignement maximal, un complément est ajouté pour atteindre ce multiple.
struct fiche_produit
{
int reference_stock;
double tarif;
int categorie;
union {
struct {
char titre[20];
char ecrivain[20];
int nombre_pages;
} ouvrage;
struct {
char motif[30];
} tasse;
struct {
char motif[30];
int coloris;
int taille_vetement;
} vetement;
} detail;
};
Détection de l'endianness avec une union
En exploitant le partage mémoire, on peut déterminer l'ordre des octets du système :
union SondeEndianness
{
int entier;
char octet;
};
int main(void)
{
union SondeEndianness sonde = {0};
sonde.entier = 1;
if (sonde.octet == 1)
{
printf("Little-endian\n");
}
else
{
printf("Big-endian\n");
}
return 0;
}
Les énumérations en C
Déclaration
Une énumération permet de lister exhaustivement des valeurs nommées représentant des constantes entières.
enum Teinte
{
ROUGE,
VERT,
BLEU
};
Les constantes énumérées reçoivent par défaut des valeurs séquentielless débutant à 0. Il est également possible d'assigner explicitement des valeurs :
enum Teinte
{
ROUGE = 2,
VERT = 4,
BLEU = 8
};
Avantages par rapport aux macros
- Amélioration de la lisibilité et de la maintenabilité du code.
- Présence d'une vérification de type, contrairement aux constantes définies via
#define. - Conservation des symboles lors du débogage, alors que le préprocesseur supprime les macros.
- Définition simultanée de plusieurs constantes en une seule déclaration.
- Respect des règles de portée : une énumération déclarée dans une fonction reste locale à celle-ci.
Utilisation pratique
enum Teinte
{
ROUGE = 1,
VERT = 2,
BLEU = 4
};
enum Teinte couleur_courante = VERT;