我有一个标题header.h
,其宏定义扩展为类定义,源文件test.cpp
包含header.h
并使用此宏。然后我使用RecursiveASTVisitor
访问所有CXXRecordDecl
。
当我访问CXXRecordDecl(扩展宏(在test.cpp中)并查询其SourceLocation
和dump()
时,该位置指向header.h
- 位置宏定义。
我需要获得的CXXRecordDecl是宏扩展的SourceLocation
- 在我的情况下它应该是test.cpp
。
提前致谢。
答案 0 :(得分:2)
找到解决方案。
所需方法是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
}