Что делает флаг fpermissive? - PullRequest
       25

Что делает флаг fpermissive?

112 голосов
/ 13 января 2012

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

ошибка: получение временного адреса [-fpermissive]

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

EDIT : Я только что нашел то, что вызывало временную часть ошибки адреса! Я собираюсь исправить эту часть прямо сейчас.

Ответы [ 4 ]

135 голосов
/ 13 января 2012

справа от документы :

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

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

43 голосов
/ 13 января 2012

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

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

15 голосов
/ 13 января 2012

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

6 голосов
/ 29 июля 2016

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

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

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

...