Я компилирую с 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?
инструмент достаточно умен, чтобы знать, что код не скомпилирован
__clang__
, но с__GNUC__
вместо
Если он сообщает предупреждение только для лязга, но делает не думаю, что __clang__
определяется, что звучит как проблема с инструментами. Если он пытается быть настолько умным в том, чтобы исказить себя, вы, возможно, впадаете в ловушку … но также вы должны жаловаться автору инструмента для создания этой ситуации в первую очередь.
Тем не менее, вы можете попробовать:
#if defined(__has_warning)
# if __has_warning("-Wdisabled-macro-expansion")
# pragma GCC diagnostic ignored "-Wdisabled-macro-expansion"# endif
#endif
Я не уверен, что это сработает … это зависит от того, как сильно инструмент притворяется не лягушат (__has_warning
это расширение только для лязга).
Других решений пока нет …