web-dev-qa-db-fra.com

Que fait le drapeau fpermissive?

Je me demande simplement ce que le drapeau -fpermissive fait dans le compilateur g ++? Je reçois:

erreur: prise d'adresse temporaire [-fpermissive]

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

EDIT: Je viens de trouver la cause de la partie erreur d'adresse temporaire! Je vais réparer cette partie maintenant.

112
GradGuy

Droit de les docs :

-fpermissive
Déclassez certains diagnostics sur les codes non conformes d’erreurs en avertissements. Ainsi, utiliser -fpermissive permettra à un code non conforme de se compiler.

En bout de ligne: ne l'utilisez pas sauf si vous savez ce que vous faites!

137
cli_hlt

Le -fpermissive flag amène le compilateur à signaler des erreurs (qui sont autorisées par certains compilateurs) sous forme d'avertissements, afin de permettre la compilation du code même s'il n'est pas conforme à la règles de langue. Vous devriez vraiment résoudre le problème sous-jacent. Publiez le plus petit exemple de code compilable qui illustre le problème.

-fpermissive
Déclassez certains diagnostics sur les codes non conformes d’erreurs en avertissements. Ainsi, utiliser -fpermissive permettra à un code non conforme de se compiler.

44
David Schwartz

Lorsque vous avez écrit quelque chose qui n'est pas autorisé par le standard de langue (et qui ne peut donc pas vraiment être un comportement bien défini, ce qui est une raison suffisante pour ne pas le faire), mais qui arrive à mapper sur certains type d’exécutable s’il est envoyé naïvement au moteur de compilation, alors -fpermissive fera exactement cela au lieu de s’arrêter avec ce message d’erreur. Dans certains cas, le programme se comportera alors exactement comme vous le vouliez au départ, mais vous ne devez absolument pas vous en fier sauf si vous avez une raison très spéciale de ne pas utiliser une autre solution.

16
leftaroundabout

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

Vous remarquerez que la compilation CFLAGS spécifie à la fois "-ansi" et "-pedantic". En théorie, cela signifie "exploser si quelque chose ne respecte même pas légèrement les spécifications linguistiques". En pratique, la série 3.x de gcc n'a pas vraiment capté ce genre de choses et sa construction avec 4.9.3 laissera un trou noir dans le sol à moins que vous ne configuriez CFLAGS et BOOTSTRAPCFLAGS sur "-fermiste".

En utilisant cet indicateur, la plupart de ces fichiers C seront effectivement créés, vous laissant ainsi libre de passer à l'épave dépendante de la version générée par le lexer. =]

6
breakpoint