#pragma (* диагностика) при смешивании анализаторов Clang с компилятором GCC - PullRequest
0 голосов
/ 24 сентября 2018

Я компилирую с GCC в Linux, но CMake достаточно любезен, чтобы создать Clang-совместимую базу данных компиляции.Это означает, что я могу запускать на своей базе кода причудливые современные инструменты на основе Clang, и эти инструменты отлично знают, как должен создаваться каждый файл (флаги, определения, пути и т. Д.). Пока все хорошо.

Но сегодня статический анализ на основе Clang в моей IDE начал показывать предупреждение, специфичное для Clang.Я не думаю, что для моего вопроса особенно важно, какое это предупреждение, но оно было warning: disabled expansion of recursive macro, сгенерировано -Wdisabled-macro-expansion.Этот конкретный макрос предоставлен третьей стороной, поэтому исправление предупреждения не является вариантом, но я хотел бы подавить его, поскольку это происходит несколько раз в рассматриваемом файле.

С чем я борюськак подавить предупреждение в инструментах анализа на основе Clang, не вызывая новых предупреждений в сборке GCC.

  • Добавление #pragma clang diagnostic ignored "-Wdisabled-macro-expansion" подавляет предупреждение для инструментов Clang, но заставляет GCC выдавать warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas].
  • Аналогично, добавление #pragma GCC diagnostic ignored "-Wdisabled-macro-expansion" подавляет предупреждение Clang (поскольку Clang пытается быть совместимым с диагностикой GCC), но заставляет GCC выдавать warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas].
  • Оборачивая любой из вышеперечисленных с #ifdef __clang__ делает GCC счастливым, но не подавляет предупреждение Clang, потому что инструмент достаточно умен, чтобы знать, что код компилируется не с __clang__, а с __GNUC__.

IsЕсть ли способ сделать диагностику #pragma видимой для инструментов Clang, но не для GCC?

1 Ответ

0 голосов
/ 24 сентября 2018

инструмент достаточно умен, чтобы знать, что код не скомпилирован с __clang__, а с __GNUC__ вместо

Если он сообщает о предупреждении только для лязга, но не считает, что __clang__ определено, что звучит как проблема с инструментами.Если он пытается быть настолько умным в том, чтобы исказить себя, вы, возможно, и впрямь впадаете в ловушку ... но вам также следует пожаловаться автору инструмента на создание этой ситуации.

Тем не менее, вы могли быпопробуйте:

#if defined(__has_warning)
#  if __has_warning("-Wdisabled-macro-expansion")
#    pragma GCC diagnostic ignored "-Wdisabled-macro-expansion"
#  endif
#endif

Я не уверен, сработает ли это ... это зависит от того, насколько сильно инструмент притворяется не лязгом (__has_warning - расширение только для лягушек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...