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;
}
Опции парсера задаются такими же флагами, которыми задается поведение самого clang
при компиляции.
В частности, это означает что можно добавить -x c++
в массив argv
при вызове clang_parseTranslationUnit
, для того чтобы указать в каком режиме парсить файл. Еще часто приходится указывать стандарт C++, например -std=c++14
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как написать программу, которое выводит прописью введенное число? Например, при вводе числа 999 результатом работы программы должна быть строка...
Есть ли в виндовом CRT средства для поиска незакрытых дескрипторов объектов (файлов, сокетов, процессов и тп
В общем я передаю массив структур объекту COM, и вроде бы все успешно происходит, но при запросе кол-ва переданных ему структур, этот объект...