LVK*_*LVK 3 llvm clang libtooling
我有一个header.h带有宏定义的标头,该宏定义扩展为类定义和一个test.cpp包含header.h并使用该宏的源文件。然后我用来RecursiveASTVisitor访问所有CXXRecordDecl的。
当我访问 CXXRecordDecl(在 test.cpp 中)并查询其扩展的 CXXRecordDecl 时,该位置指向SourceLocation-宏定义的位置。dump()header.h
我需要为这个 CXXRecordDecl 获取的是SourceLocation宏扩展 - 在我的情况下它应该是test.cpp。
提前致谢。
找到解决方案。
所需的方法是 SourceManager 的getFileLoc(SourceLocation loc)loc ,如果“是宏位置”,则“返回扩展位置” 。
我的代码用于获取普通类定义和宏扩展定义的源位置:
bool VisitCXXRecordDecl(CXXRecordDecl* record)
{
SourceLocation loc = record->getLocStart();
SourceLocation locExp = m_sourceManager.getFileLoc(loc);
// if record is a macro expansion in test.cpp, locExp points to test.cpp
// if record is not a macro expansion, locExp correctly points to matching source file
}
Run Code Online (Sandbox Code Playgroud)