Quel est le but d'utiliser-pedantic dans le compilateur GCC/g++?

Cette remarque dit:

-ansi : indique au compilateur d'implémenter l'option de langue ANSI. Ceci permet d' sur certaines "caractéristiques" de GCC qui sont incompatibles avec L'ANSI norme.

-pedantic : utilisé en conjonction avec -ansi , Ceci indique au compilateur d'être strictement conforme à la norme ANSI, rejetant le code qui n'est pas conforme.

tout d'Abord:

  • Quel est le but des options -pedantic et -ansi du compilateur GCC/g++ (Je n'ai pas pu comprendre la description ci-dessus)?
  • est-ce que quelqu'un peut me dire les bonnes circonstances pour utiliser ces deux options?
  • Quand dois-je les utiliser?
  • Sont-ils importants?
106
demandé sur Jonathan Leffler 2010-05-18 11:07:52

8 réponses

compilateurs GCC toujours essayer de compiler votre programme si cela est tout à fait possible. Toutefois, dans certains cas, les standards C et c++ spécifient que certaines extensions sont interdites. Compilateurs conformes comme gcc ou g++ doivent émettre un diagnostic lorsque ces extensions sont rencontrées. Exemple, l'option-pedantic du compilateur gcc amène gcc à émettre des avertissements dans de tels cas. En utilisant le plus strict L'option -pedantic-errors convertit ces avertissements de diagnostic en erreurs qui causeront la compilation de l'échec à un tel point. Uniquement les constructions non-ISO qui doivent être marquées par un marquage conforme le compilateur générera des avertissements ou des erreurs.

70
répondu Islam Wazery 2010-12-20 20:28:45

je l'utilise tout le temps dans mon codage.

le drapeau -ansi est équivalent à -std=c89 . Comme indiqué, il éteint certaines extensions de GCC. Ajouter -pedantic éteint plus d'extensions et génère plus d'Avertissements. Par exemple, si vous avez une chaîne de caractères littérale de plus de 509 caractères, alors -pedantic avertit à ce sujet parce qu'il dépasse la limite minimale exigée par la norme C89. Autrement dit, chaque compilateur C89 doit accepter des chaînes de longueur 509; ils sont autorisés à accepter des chaînes plus longues, mais si vous êtes pédant, il n'est pas portable Pour 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.

91
répondu Jonathan Leffler 2010-05-18 07:12:28

fondamentalement, cela rendra votre code beaucoup plus facile à compiler sous d'autres compilateurs qui mettent également en œuvre la norme ANSI, et, si vous êtes prudent dans les bibliothèques/api appels que vous utilisez, sous d'autres systèmes d'exploitation/plates-formes.

le premier, éteint les caractéristiques spécifiques de GCC. (-ANSI) Le second, se plaindra de tout ce qui ne respecte pas la norme (non seulement les caractéristiques spécifiques de GCC, mais aussi vos constructions).) (-pédant.)

14
répondu Francisco Soto 2010-05-18 07:13:23

-ansi est un commutateur obsolète qui demande au compilateur de compiler selon le révision obsolète de la norme C , ISO/IEC 9899:1990 , qui est essentiellement un changement d'image de la norme ANSI X3.159-1989 "Langage De Programmation C . Pourquoi est-il obsolète? Parce qu'après C90 a été publié par L'ISO, L'ISO a été en charge de la normalisation C, et tout rectificatifs techniques à C90 a été publié par L'ISO. Il est donc plus apte à utiliser le -std=c90 .

sans ce commutateur, les récents compilateurs GCC c seront conformes au langage C standardisé dans ISO/IEC 9899:2011 .

malheureusement, il y a des vendeurs de compilateurs paresseux qui croient qu'il est acceptable de s'en tenir à une révision de norme désuète plus ancienne, pour laquelle le document de normalisation n'est même pas disponible à partir de organismes de normalisation.

L'utilisation du commutateur permet de s'assurer que le code devrait être compilé dans ces compilateurs obsolètes.


Le -pedantic est intéressante. En l'absence de -pedantic , même lorsqu'une norme spécifique est demandée, GCC autorisera certaines extensions qui ne sont pas acceptables dans la norme C. Considérons par exemple le programme

struct test {
    int zero_size_array[0];
};

Le C11 projet de n1570 paragraphe 6.7.6 2p1 dit :

en plus des qualificatifs de type optionnels et du mot-clé static, le [ et ] peut délimiter une expression ou *. Si ils délimitent une expression (qui spécifie la taille d'un tableau), l'expression doit avoir un type entier. Si l'expression est constante, , elle doit avoir une valeur supérieure à zéro. [...]

la norme C exige que: la longueur du réseau est supérieure à zéro; et ce paragraphe est dans les contraintes ; la norme dit la suivante 5.1.1.3p1 :

une mise en œuvre conforme doit produire au moins un message de diagnostic (identifié d'une manière définie par la mise en œuvre) si une unité de traduction ou une unité de traduction prétraitement contient une violation de toute règle ou contrainte syntaxique, même si le comportement est également explicitement spécifié comme non défini ou implémentation-défini. Il n'est pas nécessaire de produire des messages de Diagnostic dans d'autres circonstances.9)

Cependant, si vous compilez le programme avec gcc -c -std=c90 pedantic_test.c , aucun avertissement n'est produite.

-pedantic fait en sorte que le compilateur soit effectivement conforme à la norme C ; il produira donc maintenant 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, spécifier la norme n'est pas suffisant, vous devez également utiliser -pedantic (ou -pedantic-errors ) pour s'assurer que GCC se conforme réellement à la lettre de la norme.


la dernière partie de la question portait sur l'utilisation de -ansi avec C++ . L'ANSI n'a jamais normalisé le langage C++ - en l'adoptant seulement à partir de L'ISO, CE qui fait à peu près autant de sens que de dire "anglais standardisé par la France". Cependant, GCC semble toujours l'accepter pour C++, aussi stupide que cela puisse paraître.

10
répondu Antti Haapala 2018-09-26 12:33:22

si votre code doit être portable alors vous pouvez tester qu'il se compile sans extensions gcc ou d'autres fonctionnalités non standard. Si votre code se compile avec -pedantic -ansi alors en théorie il devrait se compiler OK avec n'importe quel autre compilateur standard ANSI.

5
répondu Paul R 2010-05-18 07:12:04

si vous écrivez du code que vous envisagez va être compilé sur une grande variété de plates-formes, avec un certain nombre de compilateurs différents, puis en utilisant ces drapeaux vous-même aidera à s'assurer que vous ne produisez pas de code qui ne compilent sous GCC.

3
répondu Damien_The_Unbeliever 2010-05-18 07:12:27

d'Autres ont répondu suffisamment. Je voudrais juste ajouter quelques exemples d'extensions fréquentes:

Le "151910920 de la fonction" retour "à la 151920920" . Cela 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. D'ailleurs, int main() et int main(int, char**) sont les deux signatures que la norme définit.

une autre extension populaire est d'être en mesure de déclarer et de définir fonctions à l'intérieur d'autres fonctions:

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

    // ...
    g();
    // ...
}

ce n'est pas standard. Si vous voulez ce genre de comportement, consultez C++11 lambdas

1
répondu Enn Michael 2017-05-23 11:47:27

pédant fait en sorte que le compilateur gcc rejette toutes les extensions GNU C et pas seulement celles qui les rendent compatibles ANSI.

0
répondu Martin Konecny 2010-05-18 07:14:03