#c #libclang
#c #libclang
Вопрос:
Я использую libclang (привязки Python) для анализа некоторого кода на C . Мне нужно отличать включения, которые разрешаются для системных заголовков, например, #include <algorithm>
, от включений, которые разрешаются для локальных заголовков проекта, например, #include "my_header.h"
.
Проблема в том, что я не могу найти способ получить эту информацию из AST libclang.
Некоторые мысли / соображения:
- информация должна быть где-то там, поскольку при запуске clang с
-E
(только для запуска препроцессора) системные включения помечаются добавлением флага3
при их включении. Пример:
# 1 "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c /9/exception" 1 3
- конечно, я мог бы сам вызвать препроцессор и сопоставить результаты, но это добавляет накладные расходы и больше потенциальных источников ошибок
- просто искать
<>
vs""
в токенах инструкции include не работает, поскольку они просто определяют порядок поиска. - проверка начала расширенного пути к включаемому файлу для sth like
/usr/lib/...
не работает, поскольку он не зависит от платформы, и пользователь может добавлять пользовательские «системные» каталоги через-isystem
.
Я надеюсь, что вы сможете мне помочь в этом 🙂
Комментарии:
1. Почему вам нужно различать проект и системные включения?
2. Сильно упрощенный, мне нужно рекурсивно обойти проект включает в себя, но не система включает
3. помогает ли это ?
4. @n.’местоимения’m. На первый взгляд, я думаю, это решило бы мою проблему, но эта функция не отображается в привязках Python: (
5. Ну, тогда добавьте его и отправьте патч…