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

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

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

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

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

4 ответов


С документы:

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

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


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

-fpermissive
Опускать диагностику код nonconformant от ошибок до предупреждений. Таким образом, используя -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 будут фактически построены, оставляя вам возможность перейти к зависящим от версии обломкам, которые будет генерировать лексер. =]