Cette note dit:
-ansi
: indique au compilateur d'implémenter l'option de langage ANSI. Cela désactive certaines «fonctionnalités» de GCC qui sont incompatibles avec la norme ANSI.
-pedantic
: utilisé en conjonction avec-ansi
, cela indique au compilateur de se conformer strictement à la norme ANSI, en rejetant tout code non conforme.
Tout d'abord:
- Quel est le but des options
-pedantic
et-ansi
du compilateur GCC / G ++ (je n'ai pas compris la description ci-dessus)? - Quelqu'un peut-il me dire les bonnes circonstances pour utiliser ces deux options?
- Quand dois-je les utiliser?
- Sont-ils importants?
Je l'utilise tout le temps dans mon codage.
Le
-ansi
drapeau équivaut à-std=c89
. Comme indiqué, il désactive certaines extensions de GCC. L'ajout-pedantic
désactive plus d'extensions et génère plus d'avertissements. Par exemple, si vous avez une chaîne littérale de plus de 509 caractères, vous en-pedantic
avertit car elle dépasse la limite minimale requise par la norme C89. Autrement dit, chaque compilateur C89 doit accepter des chaînes de longueur 509; ils sont autorisés à accepter plus longtemps, mais si vous êtes pédant, il n'est pas portable d'utiliser des chaînes plus longues, même si un compilateur est autorisé à accepter des chaînes plus longues et, sans les avertissements pédants, GCC les acceptera aussi.la source
-std=c89 -pedantic
signifie que vous pouvez vous déplacer plus facilement entre différents compilateurs sur d'autres plates-formes. Dès que vous commencez à utiliser<windows.h>
, la compatibilité avec d'autres systèmes devient problématique.-pedantic
, mais la plupart de mon code se compile toujours correctement lorsque je le réactive (le seul programme qui n'utilisait pas explicitement des__int128
types, qui sont pédantiquement incorrects). Je pense qu'il y a eu une étape intermédiaire où GCC était trop bruyant (à mon goût) avec-pedantic
. Je viens de tester environ 300 fichiers source - du code de bibliothèque, des commandes, des programmes de test SO - et il y avait juste le problème à prévoir. Vous utilisez actuellement GCC 4.8.2 sur Mac OS X 10.9.2.-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 programmeLe projet C11 n1570 paragraphe 6.7.6.2p1 dit :
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 :
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: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.la source
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Fondamentalement, cela rendra votre code beaucoup plus facile à compiler sous d'autres compilateurs qui implémentent également la norme ANSI, et, si vous faites attention dans les bibliothèques / api que vous utilisez, sous d'autres systèmes d'exploitation / plates-formes.
Le premier, désactive les fonctionnalités SPÉCIFIQUES de GCC. (-ansi) Le second, se plaindra de TOUT ce qui ne respecte pas le standard (pas seulement les caractéristiques spécifiques de GCC, mais aussi vos constructions.) (-pedantic).
la source
Si votre code doit être portable, vous pouvez tester qu'il se compile sans extensions gcc ou autres fonctionnalités non standard. Si votre code compile avec
-pedantic -ansi
alors en théorie, il devrait compiler OK avec n'importe quel autre compilateur standard ANSI.la source
-pedantic
ne désactive pas toutes les extensions, il laisse sur un tas de trucs à double soulignement. Il peut donc être plus précis de dire que si votre code compile avec-pedantic -ansi
, et qu'il semble également plausible de se compiler sur d'autres implémentations, il se compilera.Si vous écrivez du code que vous envisagez de compiler sur une grande variété de plates-formes, avec un certain nombre de compilateurs différents, utiliser vous-même ces indicateurs vous aidera à vous assurer de ne pas produire du code qui ne se compile que sous GCC.
la source
D'autres ont suffisamment répondu. Je voudrais juste ajouter quelques exemples d'extensions fréquentes:
La
main
fonction de retourvoid
. Ceci n'est pas défini par la norme, ce qui signifie qu'il ne fonctionnera que sur certains compilateurs (y compris GCC), mais pas sur d'autres. Au fait,int main()
etint main(int, char**)
sont les deux signatures que la norme définit.Une autre extension populaire est de pouvoir déclarer et définir des fonctions dans d'autres fonctions:
Ceci n'est pas standard. Si vous voulez ce type de comportement, consultez les lambdas C ++ 11
la source
Pedantic fait en sorte que le compilateur gcc rejette toutes les extensions GNU C pas seulement celles qui le rendent compatible ANSI.
la source