C Language
Contraintes
Recherche…
Remarques
Les contraintes sont un terme utilisé dans toutes les spécifications C existantes (récemment ISO-IEC 9899-2011). Ils sont l'une des trois parties du langage décrites à l'article 6 de la norme (avec la syntaxe et la sémantique).
ISO-IEC 9899-2011 définit une contrainte comme étant:
restriction, syntaxique ou sémantique, par laquelle l'exposition des éléments du langage doit être interprétée
(Veuillez également noter qu'en termes de norme C, une "contrainte d'exécution" n'est pas une sorte de contrainte et comporte des règles très différentes.)
En d'autres termes, une contrainte décrit une règle du langage qui rendrait illégal un programme autrement syntaxiquement valide. À cet égard, les contraintes ressemblent quelque peu à un comportement non défini, tout programme qui ne les suit pas n'est pas défini en termes de langage C.
Les contraintes ont en revanche une différence très significative par rapport aux comportements non définis. Une implémentation est nécessaire pour fournir un message de diagnostic pendant la phase de traduction (partie de la compilation) si une contrainte est violée, ce message peut être un avertissement ou peut arrêter la compilation.
Noms de variables en double dans la même portée
Un exemple de contrainte tel qu'exprimé dans le standard C est d'avoir deux variables du même nom déclarées dans une portée 1) , par exemple:
void foo(int bar)
{
int var;
double var;
}
Ce code viole la contrainte et doit produire un message de diagnostic à la compilation. Ceci est très utile par rapport à un comportement indéfini, car le développeur sera informé du problème avant l'exécution du programme, ce qui risque de faire n'importe quoi.
Les contraintes ont donc tendance à être des erreurs facilement détectables au moment de la compilation, des problèmes qui entraînent un comportement indéfini mais qui seraient difficiles ou impossibles à détecter au moment de la compilation ne sont donc pas des contraintes.
1) libellé exact:
Si un identificateur n'a pas de lien, il ne doit pas y avoir plus d'une déclaration de l'identificateur (dans un déclarant ou un spécificateur de type) de même portée et dans le même espace de nom, sauf pour les étiquettes spécifiées au 6.7.2.3.
Opérateurs arithmétiques unaires
Les opérateurs unary +
et -
ne sont utilisables que sur les types arithmétiques, donc si, par exemple, on essaie de les utiliser sur une structure, le programme produira un diagnostic, par exemple:
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}