Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clang libtooling:确定宏扩展位置_Clang_Llvm_Libtooling - Fatal编程技术网

Clang libtooling:确定宏扩展位置

Clang libtooling:确定宏扩展位置,clang,llvm,libtooling,Clang,Llvm,Libtooling,我有一个headerheader.h,其中宏定义扩展为类定义,源文件test.cpp包含header.h并使用此宏。然后我使用RecursiveASTVisitor访问所有cxrecorddecl 当我访问扩展宏的CXXRecordDecl(在test.cpp中)并查询其SourceLocation和dump()时,该位置指向header.h——宏定义的位置 对于这个CXXRecordDecl,我需要得到的是宏扩展的SourceLocation——在我的例子中,它应该是test.cpp 提前感谢

我有一个header
header.h
,其中宏定义扩展为类定义,源文件
test.cpp
包含
header.h
并使用此宏。然后我使用
RecursiveASTVisitor
访问所有
cxrecorddecl

当我访问扩展宏的CXXRecordDecl(在test.cpp中)并查询其
SourceLocation
dump()
时,该位置指向
header.h
——宏定义的位置

对于这个CXXRecordDecl,我需要得到的是宏扩展的
SourceLocation
——在我的例子中,它应该是
test.cpp

提前感谢。

找到了解决方案

所需的方法是SourceManager,如果
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
}