libclang: парсинг .h файлов

104
24 ноября 2021, 11:50

libclang по-умолчанию обрабатывает .h файлы как файлы содержащие код на C.

Например, обход AST следующего класса:

class Session
{
protected:
    const std::string m_username;
    unsigned          m_id;
};

дает результат:

cursor: Session, kind: VarDecl

Если же изменить расширение файла, содержащего определение вышеупомянутого класса, на hpp, libclang начинает правильно парсить AST:

cursor: Session, of kind ClassDecl4
cursor: , of kind CXXAccessSpecifier39
cursor: m_username, of kind FieldDecl6
cursor: m_id, of kind FieldDecl6 

Собственно, вопрос: так как путь к файлу передается именно в clang_parseTranslationUnit (см. код ниже), то можно ли последнюю "заставить" обрабатывать .h файл, как файл, содержащий C++ код?

Код для проверки:

#include <iostream>
#include <clang-c/Index.h>
std::ostream& operator<<(std::ostream& os, const CXString& str)
{
    os << clang_getCString(str);
    clang_disposeString(str);
    return os;
}
int main(int argc, char** argv)
{
    auto idx = clang_createIndex(0, 0);
    auto unit = clang_parseTranslationUnit(idx, argv[1], nullptr, 0, nullptr, 0, CXTranslationUnit_None);
    if (!unit)
        return -1;
    auto cursor = clang_getTranslationUnitCursor(unit);
    clang_visitChildren(cursor, [](CXCursor c, CXCursor, CXClientData)
        {
            std::cout << "cursor: " << clang_getCursorSpelling(c) << ", "
                      << "kind: " << clang_getCursorKindSpelling(clang_getCursorKind(c)) << std::endl;
            return CXChildVisit_Recurse;
        },
        nullptr);
    clang_disposeTranslationUnit(unit);
    clang_disposeIndex(idx);
    return 0;
}
Answer 1

Опции парсера задаются такими же флагами, которыми задается поведение самого clang при компиляции.

В частности, это означает что можно добавить -x c++ в массив argv при вызове clang_parseTranslationUnit, для того чтобы указать в каком режиме парсить файл. Еще часто приходится указывать стандарт C++, например -std=c++14.

READ ALSO
Как написать программу, которая выводит прописью введенное число?

Как написать программу, которая выводит прописью введенное число?

Как написать программу, которое выводит прописью введенное число? Например, при вводе числа 999 результатом работы программы должна быть строка...

107
Поиск утечек дескрипторов

Поиск утечек дескрипторов

Есть ли в виндовом CRT средства для поиска незакрытых дескрипторов объектов (файлов, сокетов, процессов и тп

88
Баг при передаче массива Com объекту

Баг при передаче массива Com объекту

В общем я передаю массив структур объекту COM, и вроде бы все успешно происходит, но при запросе кол-ва переданных ему структур, этот объект...

88