2012-01-29 26 views
5

我使用鐺3.0庫的C/C++代碼的一些分析,我需要得到變量聲明的位置,我想這樣的代碼:如何獲得鐺變量名的位置:: VarDecl

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在最後指針指向。我怎樣才能得到第二和第三個指針的位置(只有名稱,沒有類型和初始化)?

回答

4

我目前無法測試它,但我認爲您想從VarDecl中提取由getLocation()獲得的SourceLocation。這個函數實際上是由Decl基類定義的。雖然它似乎只能識別一個位置,但似乎可用於識別整個名稱(但我並未嘗試提取其單個末端,但只是用它來指示變量)。

+0

對不起,但'getQualifierLoc()'沒有幫助。這個函數返回'NestedNameSpecifierLoc',對於我的情況它返回空對象(沒有任何信息)。 – Alexey 2012-01-30 15:00:53

+0

是的,你是對的:這實際上是用於像'const'或'volatile'這樣的東西的位置。我已經用一個示例程序進行了測試,它看起來就像使用'getLocation()'一樣簡單:雖然'VarDecl'本身想從類型開始,'getLocation()'返回的'SourceLocation'似乎可以識別名字。 – 2012-01-30 23:32:21

+0

謝謝,它真的有幫助,我不知道,爲什麼我開始使用'getSourceRange','getLocation'適合我! – Alexey 2012-01-31 14:18:21