2012-01-12 18 views
84

Me pregunto qué hace la bandera -fpermissive en el compilador g ++? Me estoy haciendo:¿Qué hace la bandera permisiva?

error: taking address of temporary [-fpermissive]

que puedo resolver dando la bandera -fpermissive al compilador.

EDIT: Acabo de encontrar lo que estaba causando la parte de error de dirección temporal! Voy a arreglar esa parte ahora mismo.

Respuesta

106

Desde the docs:

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

En pocas palabras: no utilizan a menos que sepa lo que está haciendo!

38

El -fpermissive flag hace que el compilador informe algunas cosas que en realidad son errores (pero que algunos compiladores permiten) como advertencias, para permitir la compilación del código incluso si no se ajusta a las reglas del lenguaje. Realmente deberías solucionar el problema subyacente. Publique el ejemplo de código compilable más pequeño que demuestre el problema.

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

13

Cuando ha escrito algo que no está permitido por el estándar de lenguaje (y por lo tanto no puede ser un comportamiento bien definido, lo cual es motivo suficiente para no hacerlo) pero se asigna al tipo de ejecutable si se alimenta de forma ingenua al motor de compilación, entonces -fpermissive hará exactamente eso en lugar de detenerse con este mensaje de error. En algunos casos, el programa se comportará exactamente como se pretendía originalmente, pero definitivamente no deberías confiar en él a menos que tengas una razón muy especial para no usar alguna otra solución.

+1

Algo que no está permitido por el estándar de lenguaje aún puede estar bien definido. De hecho, casi todos los compiladores tienen extensiones bien definidas. No digo que este sea el caso con todas las instancias de permisividad aunque – MikeMB

4

Si desea un caso de uso del mundo real para esto, intente compilar una versión muy antigua de X Windows, digamos, XFree86 o XOrg de aproximadamente 2004, a la vuelta de la división, utilizando un "moderno" (tos) versión de gcc, como 4.9.3.

Notarás que las CFLAGS de compilación especifican "-ansi" y "-pedantic". En teoría, esto significa "explotar si algo viola ligeramente la especificación del idioma". En la práctica, la serie 3.x de gcc no captó mucho de ese tipo de cosas, y construirlo con 4.9.3 dejará un agujero humeante en la tierra a menos que configure CFLAGS y BOOTSTRAPCFLAGS a "-permisivo".

Usando esa bandera, la mayoría de esos archivos C se construirán realmente, dejándote libre para moverte a los restos de la versión que el lexer generará. =]

Cuestiones relacionadas