Что делает фетровый флажок?

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

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

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

ИЗМЕНИТЬ: Я только что нашел причину временной части ошибки адреса! Я сейчас исправлю эту часть.

Ответ 1

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

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

Нижняя строка: не используйте, если вы не знаете, что делаете!

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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