Подтвердить что ты не робот

Определение символов препроцессора для анализатора CLION

В моем проекте есть файл, заключенный в директиву препроцессора ifdef

#ifdef SOME_SYMBOL
... entire file ...
#endif

SOME_SYMBOL определяется другим файлом, который был скомпилирован до этого, и код работает так, как ожидалось, но статический анализатор не знает об этом символе и поэтому обрабатывает SOME_SYMBOL undefined. Весь файл не имеет подсветки синтаксиса, и часть анализа просто пропущена (например, подсветка синтаксиса).

Есть ли способ сказать анализатору обработать этот символ, как он определен, без определения его в CMakeLists.txt?

У меня нет возможности определять SOME_SYMBOL в CMakeLists.txt, так как проект зависит от того, что он undefined на некоторых путях компиляции (изменение этого было бы почти невозможно).

Обновление:
Похоже, что в настоящее время это открытая проблема с JetBrains. См. Проблема CPP-2286

4b9b3361

Ответ 1

Чтобы получить подсветку синтаксиса: Перейдите в Настройки ⇒ Редактор ⇒ Цвета и шрифты ⇒ C/С++ и удалите все тики для "Условно не скомпилированный код". Таким образом, весь код будет отображаться с обычной подсветкой.

Ответ 2

Теперь у Clion есть макрос, который вы можете использовать для обнаружения среды IDE: https://youtrack.jetbrains.com/issue/CPP-1296#comment=27-1846360

#ifdef __JETBRAINS_IDE__
    // Stuff that only clion will see goes here
#endif

Это позволяет вам вставлять определения, чтобы заставить клион правильно отображать ваш код в тех случаях, когда он не может быть достаточно умным, чтобы понять его.

Макросъемка __JETBRAINS_IDE__ - это строка версии для IDE. Конкретные версии макроса существуют для разных IDE Jetbrains: __CLION_IDE__, __STUDIO_IDE__ (для Android Studio) и __APPCODE_IDE__ (для AppCode).

Yay!

Примечание. В момент написания это доступно только в последнем клиенте EAP.

Ответ 3

Задача не имеет решения для обычного случая. Но! Вы можете найти целевой и связанный контекст разрешения, где определен SOME_SYMBOL.

... в строке состояния вы можете найти переключатель "Разрешить контекст" для переключения между контекстами Debug, Release, RelWithDebInfo и MinSizeRel, чтобы разрешить ваш код в IDE с требуемыми определениями.