Files
Cours-C/ch001-normes.md
2026-04-09 15:41:00 +02:00

4.0 KiB
Raw Blame History

Chapitre 1 — Normes du langage C

1.1 Quest-ce quune norme

Une norme est un document officiel.
Elle définit comment un langage doit fonctionner.

Dans le cas du C, la norme décrit :

  • la syntaxe
  • les types
  • le comportement des instructions
  • la bibliothèque standard

Une norme permet dassurer la compatibilité.

Un programme conforme à la norme doit fonctionner sur plusieurs plateformes.

Sans norme, chaque compilateur ferait différemment.


Exemple 1 — Code conforme à la norme

#include <stdio.h>

int main(void)
{
    // Code standard, portable
    printf("Hello\n");

    return 0;
}

Exemple 2 — Code non portable

#include <stdlib.h>

int main(void)
{
    // Fonction dépendante du système
    system("pause");

    return 0;
}

Exemple 3 — Extension compilateur

int main(void)
{
    // Extension GCC non standard
    int x = ({ int a = 5; a + 2; });

    return x;
}

1.2 ANSI C / C89 / C90

Première norme officielle en 1989.

Elle pose les bases du langage.


Exemple — Style C89

#include <stdio.h>

int main(void)
{
    int a; // Déclaration en début de bloc obligatoire en C89
    a = 5;

    printf("%d\n", a);

    return 0;
}

1.3 C95

C95 est une mise à jour mineure.

Elle ajoute :

  • support des caractères larges
  • améliorations de la bibliothèque

Peu dimpact direct pour un débutant.


1.4 C99

C99 est une évolution importante.

Elle apporte :

  • déclaration de variables nimporte où
  • nouveaux types (long long)
  • type booléen (_Bool)
  • tableaux de taille variable (VLA)

Exemple — Déclaration flexible (C99)

#include <stdio.h>

int main(void)
{
    int a = 5;

    // Déclaration autorisée au milieu du code
    int b = 10;

    printf("%d\n", a + b);

    return 0;
}

Exemple — Booléen

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    bool ok = true;

    if (ok)
    {
        printf("OK\n");
    }

    return 0;
}

1.5 C11

C11 introduit des fonctionnalités modernes.

Par exemple :

  • threads standard
  • opérations atomiques
  • alignement mémoire
  • assertions à la compilation

Exemple — Static assert

_Static_assert(sizeof(int) >= 2, "int trop petit");

Notion datomiques

Une opération atomique est indivisible.

Elle ne peut pas être interrompue.

Sans atomique, deux threads peuvent modifier une variable en même temps.


Exemple — problème sans atomique

int compteur = 0;

// Deux threads
compteur = compteur + 1;

Exemple — avec atomique

#include <stdatomic.h>

int main(void)
{
    atomic_int compteur = 0;

    compteur++;

    return 0;
}

1.6 C17 / C18

Version corrective.

Corrige des défauts de la norme précédente.

Pas de nouvelles fonctionnalités majeures.


1.7 C23

C23 est la version la plus récente.

Elle modernise le langage et corrige des incohérences.


Nouveautés importantes

  • nouveaux mots-clés
  • amélioration des types
  • nettoyage de comportements historiques
  • amélioration des attributs

Exemple — nullptr

int main(void)
{
    int *p = nullptr; // C23

    return 0;
}

Exemple — attribut

[[maybe_unused]] int x;

Remarque

C23 ne change pas la philosophie du C.
Il améliore la cohérence et la sécurité.


1.8 Différences entre versions

  • C89 → base
  • C99 → modernisation
  • C11 → concurrence
  • C17 → corrections
  • C23 → nettoyage

1.9 Choisir une norme

gcc -std=c89 main.c
gcc -std=c99 main.c
gcc -std=c11 main.c
gcc -std=c17 main.c

1.10 Extensions de compilateur

Les extensions ne font pas partie du standard.

Elles peuvent être utiles.
Mais elles réduisent la portabilité.


Exemple — extension GNU

int main(void)
{
    int x = ({ int a = 10; a * 2; });

    return x;
}