Как включить -fpermissive для раздела кода - PullRequest
0 голосов
/ 08 января 2020

У меня есть C библиотека с одним заголовком, которую я хотел бы использовать в своем проекте C ++. Обычно, я бы просто включил файл, и это было бы хорошо, потому что C ++ почти надмножество C. Однако в этой библиотеке goto, которая перепрыгивает через инициализацию, нарушая стандарт C ++.

Я могу обойти это, включив флаг компилятора -fpermissive на G CC, но я хочу ошибки правильно запустить остальную часть моего кода.

Есть ли способ, которым я могу включить его только для этого одного заголовочного файла (возможно, аналогично #pragma GCC diagnostic XXX).

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Per g cc Страница man:

-fpermissive

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

Таким образом, теоретически можно разрешить компиляцию раздела как разрешающего, используя последовательность g cc предупреждений:


   //  Start permissive code
#pragma GCC diagnostic push

#pragma GCC diagnostic ignored "-Wunused-result"
#pragma GCC diagnostic ignored "-Wuninitialized"
   // .. Other #pragmas

   // Permissive Code here.

   // Restore normal processing.
#pragma GCC diagnostic pop

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

Если можно определить все (или большинство) правил, можно поставить их в файл #include.

#pragma GCC diagostic push
#include "permissive.h"
   // Permissive Code here
#pragma GCC diagostic pop
0 голосов
/ 08 января 2020

Существует #pragma GCC optimize "blah" или атрибут функции __attribute__((optimize("blah"))), который действует как аргумент -fblah, который был задан для остальной части этого файла / этой спецификации c, но это не кажется для работы с -fpermissive:

$ cat foo.cpp
#pragma GCC optimize "permissive"

void foo(int x) {
}
$ g++-8 -c -Wall -Wextra foo.cpp
foo.cpp:1:22: warning: bad option ‘-fpermissive’ to pragma ‘optimize’ [-Wpragmas]
 #pragma GCC optimize "permissive"
                      ^~~~~~~~~~~~
foo.cpp:3:16: warning: bad option ‘-fpermissive’ to attribute ‘optimize’ [-Wattributes]
  void foo(int x) {

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

...