add ch1- Normes du langage C
This commit is contained in:
311
002-ch1-env.md
Normal file
311
002-ch1-env.md
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
# Chapitre 1 — Normes du langage C
|
||||||
|
|
||||||
|
## 1.1 Qu’est-ce qu’une 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 d’assurer 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 d’impact direct pour un débutant.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.4 C99
|
||||||
|
|
||||||
|
C99 est une évolution importante.
|
||||||
|
|
||||||
|
Elle apporte :
|
||||||
|
- déclaration de variables n’importe 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 d’atomiques
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user