¿Qué hace la bandera permisiva?

121

Me pregunto qué hace la -fpermissivebandera en el compilador g ++. Estoy obteniendo:

error: tomando dirección de temporal [-fpermissive]

que puedo resolver dando la -fpermissivebandera al compilador.

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

mmirzadeh
fuente

Respuestas:

146

Directamente de los documentos :

-fpermissive
Reduzca algunos diagnósticos sobre código no conforme de errores a advertencias. Por lo tanto, el uso -fpermissivepermitirá que se compile algún código no conforme.

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

cli_hlt
fuente
5
Espero más información que el manual de citas + "no lo use hasta que sepa lo que está haciendo" de la respuesta más votada. No tengo que buscar en Google para esto. ¿Qué casos de código no conforme se degradan exactamente?
johannes_lalala
El código no no conforme se degrada, pero el diagnóstico va de errores a advertencias. El abridor de preguntas da un ejemplo. Si no sabe cuáles podrían ser los casos extremos, no debería considerar su uso.
cli_hlt
2
Lo siento, no te ofendas, pero un consejo como "no hagas algo si no conoces las implicaciones" es trivial y se adapta a todas las preguntas y no responde a ninguna.
johannes_lalala
3
.. y lo siento, pero citar el manual sin dar más detalles no es útil. Especialmente en un caso donde el manual es muy escaso.
johannes_lalala
50

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

-fpermissive
Reduzca algunos diagnósticos sobre código no conforme de errores a advertencias. Por lo tanto, el uso -fpermissivepermitirá que se compile algún código no conforme.

David Schwartz
fuente
18

Cuando ha escrito algo que no está permitido por el estándar del lenguaje (y por lo tanto no puede ser un comportamiento bien definido, lo cual es razón suficiente para no hacerlo) pero sucede que se asigna a algún tipo de ejecutable si se alimenta ingenuamente a el motor de compilación, -fpermissivelo hará en lugar de detenerse con este mensaje de error. En algunos casos, el programa se comportará exactamente como lo pretendía originalmente, pero definitivamente no debe confiar en él a menos que tenga alguna razón muy especial para no usar otra solución.

izquierda
fuente
3
Algo que no está permitido por el estándar del lenguaje aún puede estar bien definido. De hecho, casi todos los compiladores tienen extensiones bien definidas. Sin embargo
MikeMB
8

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, alrededor de la división, usando una versión "moderna" (tos) de gcc , como 4.9.3.

Notará que la compilación CFLAGS especifica tanto "-ansi" como "-pedantic". En teoría, esto significa "explotar si algo, aunque sea levemente, viola las especificaciones 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 el suelo a menos que establezca CFLAGS y BOOTSTRAPCFLAGS en "-fpermissive".

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

punto de ruptura
fuente