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


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

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

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

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

4 94

4 ответа:

С документы:

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

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

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

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

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

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

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

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