help c++ gcc compiler-options

c++ - help - gcc flags list



¿Qué hace la bandera permisiva? (4)

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

error: tomar la dirección temporal [-permisiva]

que puedo resolver dando la bandera -fpermissive al compilador.

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


Cuando ha escrito algo que no está permitido por el estándar de lenguaje (y por lo tanto no puede ser realmente un comportamiento bien definido, que es motivo suficiente para no hacerlo), pero sucede que se asigna a algún tipo de ejecutable si se lo alimenta de forma ingenua a el motor de compilación, entonces -fpermissive hará 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.


Desde el documento :

-fpermissive
Baja algunos diagnósticos sobre el código no conforme de errores a advertencias. Por lo tanto, usar -fpermissive permitirá compilar algunos códigos no conformes.

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


El -fpermissive 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
Baja algunos diagnósticos sobre el código no conforme de errores a advertencias. Por lo tanto, usar -fpermissive permitirá compilar algunos códigos no conformes.


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

Notarás que el build CFLAGS especifica tanto "-ansi" como "-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 dependientes de la versión que generará el lexer. =]