#pragma (* диагностика) при смешивании анализаторов Clang с компилятором GCC

Я компилирую с 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__ вместо.

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

1

Решение

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

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

Тем не менее, вы можете попробовать:

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector