Що робить прагматичний прапор?


121

Мені просто цікаво, що -fpermissiveпрапор робить у компіляторі g ++? Я отримую:

помилка: прийняття адреси тимчасового [-дозволу]

що я можу вирішити, подавши -fpermissiveпрапор компілятору.

EDIT : Я щойно знайшов причину тимчасової помилки адреси! Я зараз виправлю цю частину.

Відповіді:


146

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

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

Підсумок: не використовуйте його, якщо ви не знаєте, що ви робите!


5
Я очікую більше інформації, ніж цитування посібника + "не використовуй її, поки не дізнаєшся, що робиш", з найвищої відповіді. Мені для цього не потрібно гугл. Які випадки невідповідного коду точно знижуються?
johannes_lalala

Невідповідний код знижується, але діагностика - від помилок до попереджень. Приклад наводить відкривач запитань. Якщо ви не знаєте, якими можуть бути крайові корпуси, не варто розглянути можливість їх використання.
cli_hlt

2
Вибачте людину, не ображайтесь, але поради типу "не робіть чогось, якщо ви не знаєте наслідків" є тривіальною і підходить до кожного питання і не відповідає на жодне.
johannes_lalala

3
.. і вибачте, але цитувати посібник, не розробляючи його взагалі, не корисно. Особливо у випадку, коли керівництво дуже рідке.
johannes_lalala

50

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

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


18

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


3
Щось, що заборонено мовним стандартом, все ще можна чітко визначити. Насправді майже кожен компілятор має чітко визначені розширення. Не кажучи, що це стосується всіх дозвільних випадків
MikeMB

8

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

Ви помітите, що CFLAGS збірки вказує і "-ansi", і "-pedantic". Теоретично це означає: "підірвати, якщо щось навіть трохи порушує мовну специфікацію". На практиці серія 3.x gcc не сприймає такої речі, і побудова її з 4.9.3 не залишить отворів для куріння в землі, якщо ви не встановите CFLAGS та BOOTSTRAPCFLAGS на "-permismissive".

Використовуючи цей прапор, більшість цих файлів на C фактично буде створено, залишаючи вас вільним переходити до уламків, залежних від версії, які буде генеруватися лексером. =]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.