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++
到数组中以指定以哪种模式解析文件。通常还需要指定 C++ 标准,例如.argv
clang_parseTranslationUnit
-std=c++14