2012-01-12 18 views
84

Mi chiedo cosa fa il flag -fpermissive nel compilatore g ++? Io sono sempre:Cosa fa il flag fpermissive?

error: taking address of temporary [-fpermissive]

che posso risolvere dando la bandiera -fpermissive al compilatore.

EDIT: Ho appena trovato ciò che stava causando la parte di errore dell'indirizzo temporaneo! Ho intenzione di sistemare quella parte in questo momento.

risposta

106

destro da the docs:

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

Bottom line: non usano a meno che non si sa cosa si sta facendo!

38

Il -fpermissive flag fa in modo che il compilatore segnali alcune cose che in realtà sono errori (ma sono consentiti da alcuni compilatori) come avvertenze, per consentire al codice di compilare anche se non è conforme alle regole della lingua. Dovresti davvero risolvere il problema sottostante. Pubblica il campione di codice più piccolo e compilabile che mostri il problema.

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

13

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

+1

Qualcosa che non è consentito dallo standard di lingua può ancora essere ben definito. Infatti quasi ogni compilatore ha estensioni ben definite. Non dire questo è il caso con tutti i casi di permissivo però – MikeMB

4

Se si desidera un caso di utilizzo del mondo reale per questo, prova a compilare una versione molto vecchia di X Windows, ad esempio XFree86 o XOrg da aboout 2004, proprio intorno allo split-- utilizzando un "moderno" (tosse) versione di gcc, come 4.9.3.

Si noterà che le CFLAG di compilazione specificano sia "-ansi" che "-pedantic". In teoria, questo significa "saltare in aria se qualcosa viola anche leggermente le specifiche del linguaggio". In pratica, la serie 3.x di gcc non ha catturato molto di quel tipo di cose, e costruendola con 4.9.3 lascerà un buco fumante nel terreno a meno che non imposti CFLAGS e BOOTSTRAPCFLAGS su "-fpermissive".

Utilizzando questo flag, la maggior parte di questi file C verrà effettivamente creata, lasciandovi liberi di passare al relitto dipendente dalla versione generato dal lexer. =]