C++ 如何在clang::VarDecl中获取变量名的位置

C++ 如何在clang::VarDecl中获取变量名的位置,c++,clang,C++,Clang,我正在使用clang 3.0库对C/C++代码进行一些分析,我需要获取变量声明的位置,我尝试了以下代码: clang::VarDecl * vd = ...; clang::SourceManager & srcMgr = ...; clang::SourceRange loc = vd->getSourceRange(); clang::PresumedLoc locStart = srcMgr.getPresumedLoc(loc.getBegin()); clang::Pr

我正在使用clang 3.0库对C/C++代码进行一些分析,我需要获取变量声明的位置,我尝试了以下代码:

clang::VarDecl * vd = ...;
clang::SourceManager & srcMgr = ...;

clang::SourceRange loc = vd->getSourceRange();
clang::PresumedLoc locStart = srcMgr.getPresumedLoc(loc.getBegin());
clang::PresumedLoc locEnd = srcMgr.getPresumedLoc(loc.getEnd());
但是locStartlocEnd指向声明变量的开头(和结尾)(带有类型,可能还有初始化器)。例如:

const char * ptr = 0;
^            ^ ^   ^

locStart将指向第一个指针(
^
),locEnd将指向最后一个指针。如何获取第二个和第三个指针的位置(只有名称,没有类型和初始化器)?

我目前无法测试它,但我认为您希望从
VarDecl
中提取
getLocation()
获得的
SourceLocation
。这个函数实际上是由
Decl
基类定义的。虽然它似乎只标识一个位置,但它似乎可以用于标识整个名称(我没有尝试提取它的各个端点,但是,只是用它来指示变量)。

对不起,但是
getQualifierLoc()
没有帮助。这个函数返回
NestedNameSpecifierLoc
,在我的例子中,它返回空对象(没有任何信息)。是的,你是对的:这实际上是用于
const
volatile
等对象的位置。我已经用一个示例程序进行了测试,它似乎与使用
getLocation()
一样简单:虽然
VarDecl
本身希望以类型开头,但是
getLocation()
返回的
SourceLocation
似乎可以识别名称。谢谢,它确实有帮助,我不知道,为什么我开始使用
getSourceRange
getLocation
对我很有用@Alexey-请在回答中发布代码,以便更好地理解和参考。