2012-01-29 28 views
5

Tôi đang sử dụng thư viện clang 3.0 để phân tích mã C/C++, và tôi cần lấy vị trí khai báo biến, tôi đã thử mã này:Cách lấy vị trí tên biến trong clang :: 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()); 

Nhưng locStartlocEnd trỏ đến đầu (và kết thúc) của biến khai báo (có loại và, có thể là người khởi tạo). Ví dụ:

const char * ptr = 0; 
^   ^^ ^

locStart sẽ trỏ vào con trỏ đầu tiên (^), và locEnd sẽ trỏ vào con trỏ ngoái. Làm thế nào tôi có thể có được vị trí của con trỏ thứ hai và thứ ba (chỉ tên, không có kiểu và khởi tạo)?

Trả lời

4

Tôi hiện không ở vị trí để thử nghiệm nhưng tôi nghĩ bạn muốn trích xuất SourceLocation thu được bằng getLocation() từ số VarDecl của mình. Hàm này thực sự được xác định bởi lớp cơ sở Decl. Mặc dù có vẻ như chỉ xác định một vị trí nhưng dường như có thể sử dụng để xác định toàn bộ tên (tôi chưa cố gắng trích xuất các kết thúc riêng lẻ của nó, tuy nhiên, chỉ sử dụng nó để chỉ biến).

+0

Xin lỗi, nhưng 'getQualifierLoc()' không có tác dụng. Hàm này trả về 'NestedNameSpecifierLoc' và đối với trường hợp của tôi, nó trả về đối tượng rỗng (không có bất kỳ thông tin nào). – Alexey

+0

Có, bạn nói đúng: đây thực sự là vị trí của những thứ như 'const' hoặc' volatile'. Tôi đã thử nghiệm với một chương trình mẫu và có vẻ như nó đơn giản như sử dụng 'getLocation()': trong khi 'VarDecl' chính nó muốn bắt đầu với kiểu,' SourceLocation' được trả về bởi 'getLocation()' dường như xác định tên. –

+0

Cảm ơn, nó thực sự giúp, tôi không biết, tại sao tôi bắt đầu sử dụng 'getSourceRange',' getLocation' làm việc cho tôi! – Alexey

Các vấn đề liên quan