Что делает разрешающий флаг?

121

Мне просто интересно, что -fpermissiveделает флаг в компиляторе g ++? Я получаю:

ошибка: взятие адреса временного [-fpermissive]

что я могу решить, передав -fpermissiveфлаг компилятору.

РЕДАКТИРОВАТЬ : Я только что обнаружил, что вызывало временную ошибку адреса! Я собираюсь исправить эту часть прямо сейчас.

mmirzadeh
источник

Ответы:

146

Прямо из документов :

-fpermissive
Понизьте диагностику несоответствующего кода с ошибок до предупреждений. Таким образом, использование -fpermissiveпозволит скомпилировать несоответствующий код.

Итог: не используйте его, если не знаете, что делаете!

cli_hlt
источник
5
Я ожидаю больше информации, чем процитировать руководство + «не используйте его, пока не узнаете, что делаете» из наиболее проголосовавшего ответа. Для этого мне не нужно гуглить. Какие именно случаи несоответствующего кода переводятся в более раннюю версию?
johannes_lalala
Несоответствующий код понижается до версии, но диагностика - от ошибок до предупреждений. В начале вопроса приводится пример. Если вы не знаете, какие могут быть крайние случаи, вам не следует рассматривать его использование.
cli_hlt
2
Извини, мужик, без обид, но такой совет, как «не делай чего-нибудь, если не знаешь, что будет», тривиален и подходит ко всем вопросам и не отвечает ни на один.
johannes_lalala
3
... и извините, но просто цитирование руководства без каких-либо подробностей не помогает. Особенно в том случае, если руководство очень скудное.
johannes_lalala
50

-fpermissiveФлаг заставляет компилятор сообщать некоторые вещи, которые на самом деле ошибки (но допускаемые некоторые компиляторы) в качестве предупреждения, чтобы код разрешения компилирует , даже если он не соответствует правилам языка. Вам действительно следует исправить основную проблему. Разместите наименьший компилируемый образец кода, демонстрирующий проблему.

-fpermissive
Понизьте диагностику несоответствующего кода с ошибок до предупреждений. Таким образом, использование -fpermissiveпозволит скомпилировать несоответствующий код.

Дэвид Шварц
источник
18

Когда вы написали что-то, что не разрешено языковым стандартом (и, следовательно, не может быть четко определенным поведением, что является достаточной причиной, чтобы этого не делать), но случайно отображается на какой- то исполняемый файл, если его наивно кормить механизм компиляции -fpermissiveбудет делать это вместо того, чтобы останавливаться с этим сообщением об ошибке. В некоторых случаях программа будет вести себя именно так, как вы изначально планировали, но вам определенно не следует полагаться на нее, если у вас нет особых причин не использовать какое-либо другое решение.

leftaroundabout
источник
3
То, что не разрешено языковым стандартом, все же можно четко определить. Фактически почти у каждого компилятора есть четко определенные расширения. Не говоря уже о том, что это относится ко всем экземплярам разрешающего действия
MikeMB
8

Если вам нужен реальный вариант использования для этого, попробуйте скомпилировать очень старую версию X Windows - скажем, XFree86 или XOrg примерно 2004 года, прямо в районе разделения - используя "современную" (кашляющую) версию gcc. , например 4.9.3.

Вы заметите, что в сборке CFLAGS указаны как «-ansi», так и «-pedantic». Теоретически это означает «взорвать, если что-то хоть немного нарушает спецификацию языка». На практике gcc серии 3.x не улавливает очень много подобных вещей, и сборка его с помощью 4.9.3 оставит дымящуюся дыру в земле, если вы не установите CFLAGS и BOOTSTRAPCFLAGS на «-fpermissive».

Используя этот флаг, большинство этих файлов C будут фактически построены, что позволит вам перейти к зависящим от версии обломкам, которые сгенерирует лексер. знак равно

точка остановки
источник