Quel est le but de l’utilisation de -pedantic dans le compilateur GCC / G ++?

Cette note dit:

-ansi : indique au compilateur d’implémenter l’option de langage ANSI. Cela désactive certaines “fonctionnalités” de GCC incompatibles avec la norme ANSI.

-pedantic : utilisé en conjonction avec -ansi , cela indique que le compilateur doit respecter ssortingctement la norme ANSI, en rejetant tout code non conforme.

Les premières choses 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 devrais-je les utiliser?
  • Sont-ils importants?

Les compilateurs GCC essayent toujours de comstackr votre programme si cela est possible. Cependant, dans certains cas, les normes C et C ++ spécifient que certaines extensions sont interdites. Les compilateurs conformes tels que gcc ou g ++ doivent émettre un diagnostic lorsque ces extensions sont rencontrées. Par exemple, l’option -pedantic du compilateur gcc provoque des avertissements dans de tels cas. L’utilisation de l’option -pedantic-errors plus ssortingcte convertit ces avertissements de diagnostic en erreurs entraînant l’échec de la compilation en de tels points. Seules les constructions non-ISO qui doivent être marquées par un compilateur conforme génèrent des avertissements ou des erreurs.

Je l’utilise tout le temps dans mon codage.

Le drapeau -ansi est équivalent à -std=c89 . Comme indiqué, il désactive certaines extensions de GCC. L’ajout de -pedantic désactive davantage d’extensions et génère plus d’avertissements. Par exemple, si vous avez un littéral de chaîne supérieur à 509 caractères, alors -pedantic avertit car il dépasse la limite minimale requirejse par la norme C89. C’est-à-dire que 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 que, sans les avertissements pédants, GCC les acceptera également.

Fondamentalement, il sera beaucoup plus facile de comstackr votre code sous d’autres compilateurs qui implémentent également la norme ANSI et, si vous êtes attentif aux bibliothèques / appels 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 fonctionnalités spécifiques de GCC, mais aussi vos constructions.) (-pedantic).

-ansi est un commutateur obsolète qui demande au compilateur de comstackr selon la révision obsolète de la norme C , ISO / IEC 9899: 1990 , qui date de 27 ans et qui est essentiellement un rebranding de la norme ANSI X3.159-1989 “Langage de programmation C : pourquoi obsolète Car après la publication de la norme C90 par l’ISO, l’ISO a été chargée de la normalisation C, et l’ISO a publié toute corrigenda technique relative à la -std=c90 .

Sans ce commutateur, les récents compilateurs GCC C seront conformes au langage C normalisé dans ISO / IEC 9899: 2011 . Malheureusement, certains fournisseurs de compilateurs paresseux estiment qu’il est acceptable de s’en tenir à la révision standard du compilateur, pour laquelle le document de normalisation n’est même pas disponible auprès d’organismes standard. L’utilisation du commutateur garantit que le code sera compilé dans ces compilateurs obsolètes.


La -pedantic est intéressante. En l’absence de -pedantic , même lorsqu’une norme spécifique est requirejse, GCC autorisera toujours certaines extensions qui ne sont pas acceptables dans le standard C. Considérons par exemple le programme

 struct test { int zero_size_array[0]; }; 

Le projet de paragraphe n ° 1570 n ° 6.7.6.2p1 de la C11 dit :

En plus des qualificatifs de type facultatifs et du mot-clé static, le [et] peut 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 ce qui suit 5.1.1.3p1 :

Une implémentation conforme doit produire au moins un message de diagnostic (identifié de manière définie par l’implémentation) si une unité de traduction ou une unité de traduction de prétraitement enfreint une règle ou une contrainte de syntaxe, même si elle est explicitement définie comme non définie ou implémentée. défini. Les messages de diagnostic n’ont pas besoin d’être produits dans d’autres circonstances.9)

Cependant, si vous comstackz le programme avec gcc -c -std=c90 pedantic_test.c , aucun avertissement n’est généré.

-pedantic oblige le compilateur à se conformer au standard C ; alors maintenant il produira un avertissement, 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, la spécification de la norme ne suffit pas, vous devez également utiliser -pedantic (ou -pedantic-errors ) pour vous assurer que GCC respecte bien la lettre de la norme.


La dernière partie de la question portait sur l’utilisation de -ansi avec C ++ . ANSI n’a jamais standardisé le langage C ++ – l’adoptant seulement de l’ISO, cela a donc autant de sens que de dire «l’anglais comme standardisé par la France». Cependant, GCC semble toujours l’accepter pour C ++, aussi stupide que cela puisse paraître.

Si votre code doit être portable, vous pouvez tester qu’il comstack sans aucune extension gcc ni aucune autre fonctionnalité non standard. Si votre code comstack avec -pedantic -ansi il devrait en théorie être compilé avec tout autre compilateur standard ANSI.

Si vous écrivez du code que vous envisagez de comstackr sur une grande variété de plates-formes, avec un certain nombre de compilateurs différents, l’utilisation de ces indicateurs vous aidera à ne pas produire du code qui ne comstack que sous GCC.

D’autres ont répondu suffisamment. Je voudrais juste append quelques exemples d’extensions fréquentes:

La fonction main retourne void . Ce n’est pas défini par la norme, ce qui signifie que cela ne fonctionnera que sur certains compilateurs (y compris GCC), mais pas sur d’autres. Par ailleurs, int main() et int main(int, char**) sont les deux signatures que le standard définit.

Une autre extension populaire est la possibilité de déclarer et de définir des fonctions dans d’autres fonctions:

 void f() { void g() { // ... } // ... g(); // ... } 

Ceci est non standard. Si vous voulez ce genre de comportement, consultez C ++ 11 lambdas

Pedantic fait en sorte que le compilateur gcc rejette toutes les extensions GNU C et pas seulement celles qui le rendent compatible ANSI.