-ansi
est un commutateur obsolète qui demande au compilateur de compiler selon le 30 ans révision obsolète de la norme C , ISO / CEI 9899: 1990 , qui est essentiellement un changement de nom de la norme ANSI X3.159-1989 « Langage de programmation C . Pourquoi obsolète? Parce qu'après la publication de C90 par l'ISO, l'ISO a été en charge de la normalisation C, et tout corrigenda technique à C90 a été publié par l'ISO -std=c90
.
Sans ce commutateur, les récents compilateurs GCC C seront conformes au langage C normalisé dans ISO / CEI 9899: 2011 , ou à la dernière révision de 2018.
Malheureusement, certains fournisseurs de compilateurs paresseux pensent qu'il est acceptable de s'en tenir à une révision standard obsolète plus ancienne, pour laquelle le document de normalisation n'est même pas disponible auprès des organismes standard.
L'utilisation du commutateur permet de garantir que le code doit être compilé dans ces compilateurs obsolètes.
Le -pedantic
est intéressant. En l'absence de -pedantic
, même lorsqu'une norme spécifique est demandée, GCC autorisera toujours certaines extensions qui ne sont pas acceptables dans la norme C. Prenons par exemple le programme
struct test {
int zero_size_array[0];
};
Le projet C11 n1570 paragraphe 6.7.6.2p1 dit :
En plus des qualificateurs de type facultatifs et du mot-clé static, les [et] peuvent délimiter une expression ou *. S'ils délimitent une expression (qui spécifie la taille d'un tableau), l'expression doit avoir un type entier. Si l'expression est une expression constante, elle doit avoir une valeur supérieure à zéro. [...]
La norme C exige que la longueur du tableau soit supérieure à zéro; et ce paragraphe est dans les contraintes ; la norme dit le 5.1.1.3p1 suivant :
Une implémentation conforme doit produire au moins un message de diagnostic (identifié d'une manière définie par l'implémentation) si une unité de traduction de prétraitement ou une unité de traduction contient une violation d'une règle de syntaxe ou d'une contrainte, même si le comportement est également explicitement spécifié comme indéfini ou implémentation. défini. Les messages de diagnostic n'ont pas besoin d'être produits dans d'autres circonstances.9)
Cependant, si vous compilez le programme avec gcc -c -std=c90 pedantic_test.c
, aucun avertissement n'est généré.
-pedantic
oblige le compilateur à se conformer réellement à la norme C ; alors maintenant, il produira un message de diagnostic, comme l'exige la norme:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Ainsi, pour une portabilité maximale, spécifier la révision standard ne suffit pas, vous devez également utiliser -pedantic
(ou -pedantic-errors
) pour vous assurer que GCC est effectivement conforme à la lettre de la norme.
La dernière partie de la question portait sur l'utilisation -ansi
avec C ++ . L'ANSI n'a jamais normalisé le langage C ++ - en l'adoptant uniquement à partir de l'ISO, cela a donc autant de sens que de dire «l'anglais normalisé par la France». Cependant, GCC semble toujours l'accepter pour C ++, aussi stupide que cela puisse paraître.