« Programmation C/Classe de stockage » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 21 :
Exemple :
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
 
Ligne 40 :
return 0;
}
</syntaxhighlight>
</source>
Résultat d'exécution du code ci dessus :
<sourcesyntaxhighlight lang="c">
i vaut 1 et j vaut 1.
i vaut 2 et j vaut 1.
i vaut 3 et j vaut 1.
</sourcesyntaxhighlight>
 
Il est déconseillé de redéfinir plusieurs fois la même variable statique dans différents blocs, car le résultat peut être surprenant :
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
 
Ligne 74 :
return 0;
}
</syntaxhighlight>
</source>
 
Affiche
<syntaxhighlight>
<source>
deb fun: A
deb bloc: A
Ligne 86 :
fin bloc: N
fin fun: C
</syntaxhighlight>
</source>
 
On voit que la durée de vie de la variable de bloc statique ne commence qu'à partir de sa déclaration, même si la déclaration n'est exécutée qu'une fois au cours du programme.
Ligne 114 :
Aujourd'hui, ce mot-clé est déconseillé sauf pour des cas particuliers, les compilateurs modernes sachant généralement mieux que le programmeur comment optimiser et quelles variables placer dans les registres.
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
 
Ligne 129 :
return 0;
}
</syntaxhighlight>
</source>
 
=== Classe 'auto' ===
Ligne 147 :
 
{{Erreur volontaire}}
<sourcesyntaxhighlight lang="c">
const int i = 0;
i = 1; /* erreur*/
</syntaxhighlight>
</source>
 
En fait, le mot-clé <code>const</code> est beaucoup plus utilisé avec des pointeurs. Pour indiquer qu'on ne modifie pas l'objet pointé, il est bon de spécificier le mot-clé <code>const</code> :
 
<sourcesyntaxhighlight lang="c">
void fonction( const char * pointeur )
{
Ligne 160 :
pointeur = "Nouvelle chaine de caractères";
}
</syntaxhighlight>
</source>
 
Dans cet exemple, on indique que l'objet pointé ne sera pas modifié. Pour indiquer que la valeur elle-même du pointeur est constante, il faut déclarer la variable de la sorte :
 
{{Erreur volontaire}}
<sourcesyntaxhighlight lang="c">
char * const pointeur = "Salut tout le monde !";
pointeur = "Hello world !"; /* erreur*/
</syntaxhighlight>
</source>
 
Encore plus subtil, on peut mélanger les deux :
 
{{Erreur volontaire|nombre=2}}
<sourcesyntaxhighlight lang="c">
const char * const pointeur = "Salut tout le monde !";
pointeur = "Hello world !"; /* erreur*/
pointeur[0] = 0; /* erreur*/
</syntaxhighlight>
</source>
 
Cette dernière forme est néanmoins rarement usitée. En outre ce dernier exemple présente un autre problème qui est la modification d'une chaine de caractères « en dur », qui sont la plupart du temps placées dans la section lecture seule du programme et donc inaltérables.
Ligne 183 :
Attention <code>const</code> n'est pas une protection réelle contre les changements de valeur, qu'elles proviennent d'un comportement indéfini, ou de constructions valides du C telle que
 
<sourcesyntaxhighlight lang="c">
const char lettre = 'A';
memset(&lettre, 'B', 1);
putchar(lettre); /* affiche B */
</syntaxhighlight>
</source>
 
En outre certaines constructions du C même si elles n'indiquent pas être <code>const</code> le sont effectiement.
 
<sourcesyntaxhighlight lang="c">
int nombres[3] = {1, 2, 3};
int * autres_nombres;
Ligne 197 :
char * phrase = "Salut tout le monde !";
phrase[0] = 's'; /* erreur probable à l'exécution, une chaine de caractères littérale ne peut pas être modifiée */
</syntaxhighlight>
</source>
 
=== Qualificateur 'volatile' ===