Que fait le drapeau fpermissive?


121

Je me demande simplement ce que fait l' -fpermissiveindicateur dans le compilateur g ++? Je reçois:

erreur: prise de l'adresse temporaire [-fpermissive]

que je peux résoudre en donnant le -fpermissivedrapeau au compilateur.

EDIT : Je viens de trouver ce qui causait l'erreur d'adresse temporaire! Je vais réparer cette partie maintenant.

Réponses:


146

Dès la documentation :

-fpermissive
Rétrogradez certains diagnostics sur le code non conforme des erreurs aux avertissements. Ainsi, l'utilisation -fpermissivepermettra à du code non conforme de se compiler.

En bout de ligne: ne l'utilisez pas à moins de savoir ce que vous faites!


5
J'attends plus d'informations que de citer le manuel + "ne l'utilisez pas avant de savoir ce que vous faites" de la réponse la plus votée. Je n'ai pas besoin de google pour ça. Quels cas de code non conforme sont rétrogradés exactement?
johannes_lalala

Le code non conforme est déclassé, mais les diagnostics vont des erreurs aux avertissements. Un exemple est donné par l'ouvreur de questions. Si vous ne savez pas quels pourraient être les cas extrêmes, vous ne devriez pas envisager de l'utiliser.
cli_hlt

2
Désolé mec, pas d'offense, mais des conseils comme "ne faites pas quelque chose si vous ne connaissez pas les implications" sont triviaux et correspondent à toutes les questions et ne répondent à aucune.
johannes_lalala

3
.. et désolé, mais simplement citer le manuel sans élaborer du tout n'est pas utile. Surtout dans un cas où le manuel est très rare.
johannes_lalala

50

L' -fpermissiveindicateur amène le compilateur à signaler certaines choses qui sont en fait des erreurs (mais qui sont autorisées par certains compilateurs) comme des avertissements, pour permettre au code de se compiler même s'il n'est pas conforme aux règles du langage. Vous devriez vraiment résoudre le problème sous-jacent. Publiez le plus petit exemple de code compilable qui illustre le problème.

-fpermissive
Rétrogradez certains diagnostics sur le code non conforme des erreurs aux avertissements. Ainsi, l'utilisation -fpermissivepermettra à du code non conforme de se compiler.


18

Lorsque vous avez écrit quelque chose qui n'est pas autorisé par le standard du langage (et ne peut donc pas vraiment être un comportement bien défini, ce qui est une raison suffisante pour ne pas le faire) mais qu'il se mappe à une sorte d'exécutable s'il est nourri naïvement à le moteur de compilation, puis -fpermissivefera exactement cela au lieu de s'arrêter avec ce message d'erreur. Dans certains cas, le programme se comportera alors exactement comme vous l'aviez initialement prévu, mais vous ne devriez certainement pas vous y fier à moins que vous n'ayez une raison très particulière de ne pas utiliser une autre solution.


3
Quelque chose qui n'est pas autorisé par la norme de langage peut encore être bien défini. En fait, presque tous les compilateurs ont des extensions bien définies. Ne pas dire que c'est le cas avec toutes les instances de permissif
MikeMB

8

Si vous voulez un cas d'utilisation réel pour cela, essayez de compiler une très ancienne version de X Windows - par exemple, XFree86 ou XOrg à partir de 2004, juste autour de la scission - en utilisant une version «moderne» (toux) de gcc , comme 4.9.3.

Vous remarquerez que les CFLAGs de construction spécifient à la fois "-ansi" et "-pedantic". En théorie, cela signifie «exploser si quelque chose enfreint même légèrement les spécifications du langage». En pratique, la série 3.x de gcc n'a pas beaucoup attrapé ce genre de choses, et la construire avec 4.9.3 laissera un trou de fumée dans le sol à moins que vous ne régliez CFLAGS et BOOTSTRAPCFLAGS sur "-fpermissive".

En utilisant cet indicateur, la plupart de ces fichiers C seront réellement construits, vous laissant libre de passer à l'épave dépendante de la version que le lexer générera. =]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.