Files
Cours-C/002-ch1-env.md

312 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```c
#include <stdio.h>
int main(void)
{
// Code standard, portable
printf("Hello\n");
return 0;
}
```
---
### Exemple 2 — Code non portable
```c
#include <stdlib.h>
int main(void)
{
// Fonction dépendante du système
system("pause");
return 0;
}
```
---
### Exemple 3 — Extension compilateur
```c
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
```c
#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)
```c
#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
```c
#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
```c
_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
```c
int compteur = 0;
// Deux threads
compteur = compteur + 1;
```
---
### Exemple — avec atomique
```c
#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
```c
int main(void)
{
int *p = nullptr; // C23
return 0;
}
```
---
### Exemple — attribut
```c
[[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
```bash
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
```c
int main(void)
{
int x = ({ int a = 10; a * 2; });
return x;
}
```