Cosa fa la bandiera fpermissive?


121

Mi chiedo solo cosa fa il -fpermissiveflag nel compilatore g ++? Sto ottenendo:

errore: prendendo l'indirizzo di [-fpermissive] temporaneo

che posso risolvere dando il -fpermissiveflag al compilatore.

EDIT : ho appena scoperto cosa stava causando la parte di errore dell'indirizzo temporaneo! Sistemerò quella parte adesso.

Risposte:


146

Direttamente dai documenti :

-fpermissive
Esegui il downgrade di alcune diagnostiche sul codice non conforme da errori ad avvisi. Pertanto, l'utilizzo -fpermissiveconsentirà la compilazione di codice non conforme.

In conclusione: non usarlo se non sai cosa stai facendo!


5
Mi aspetto più informazioni rispetto al manuale di citazione + "non usarlo finché non sai cosa stai facendo" dalla risposta con il voto più alto. Non devo cercare su Google per questo. Quali casi di codice non conforme vengono declassati esattamente?
johannes_lalala

Il codice non conforme viene declassato, ma la diagnostica passa dagli errori agli avvisi. Un esempio è dato dall'apriporta delle domande. Se non sai quali potrebbero essere i casi limite, non dovresti considerare di usarli.
cli_hlt

2
Scusa amico, senza offesa, ma un consiglio come "non fare qualcosa se non conosci le implicazioni" è banale e si adatta a ogni domanda e non risponde a nessuna.
johannes_lalala

3
.. e mi dispiace, ma solo citare il manuale senza elaborarlo non è utile. Soprattutto in un caso in cui il manuale è molto scarno.
johannes_lalala

50

Il -fpermissiveflag fa sì che il compilatore riporti alcune cose che sono effettivamente errori (ma sono consentiti da alcuni compilatori) come avvertimenti, per consentire al codice di compilarsi anche se non è conforme alle regole del linguaggio. Dovresti davvero risolvere il problema sottostante. Pubblica il più piccolo esempio di codice compilabile che dimostri il problema.

-fpermissive
Esegui il downgrade di alcune diagnostiche sul codice non conforme da errori ad avvisi. Pertanto, l'utilizzo -fpermissiveconsentirà la compilazione di codice non conforme.


18

Quando hai scritto qualcosa che non è consentito dallo standard del linguaggio (e quindi non può essere un comportamento ben definito, che è una ragione sufficiente per non farlo), ma ti capita di mappare un qualche tipo di eseguibile se alimentato ingenuamente a il motore di compilazione, quindi -fpermissivefarà proprio questo invece di fermarsi con questo messaggio di errore. In alcuni casi, il programma si comporterà quindi esattamente come previsto originariamente, ma non dovresti assolutamente fare affidamento su di esso a meno che tu non abbia una ragione molto speciale per non usare qualche altra soluzione.


3
Qualcosa che non è consentito dallo standard linguistico può ancora essere ben definito. In effetti quasi tutti i compilatori hanno estensioni ben definite. Tuttavia, non dico che questo sia il caso di tutte le istanze di permissivo
MikeMB

8

Se vuoi un caso d'uso nel mondo reale per questo, prova a compilare una versione molto vecchia di X Windows, ad esempio XFree86 o XOrg del 2004, proprio intorno alla divisione, usando una versione "moderna" (tosse) di gcc , come 4.9.3.

Noterai che la build CFLAGS specifica sia "-ansi" che "-pedantic". In teoria, questo significa "saltare in aria se qualcosa viola anche leggermente le specifiche della lingua". In pratica, la serie 3.x di gcc non ha catturato molto di quel genere di cose, e costruendola con 4.9.3 lascerà un buco nel terreno a meno che non imposti CFLAGS e BOOTSTRAPCFLAGS su "-fpermissive".

Usando quel flag, la maggior parte di quei file C verrà effettivamente compilata, lasciandoti libero di passare al relitto dipendente dalla versione che il lexer genererà. =]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.