2012-08-08 26 views
2

我目前正在使用clang的python綁定編寫一個靜態C++代碼分析器,並且出於某種原因,我找不到任何東西是extern或者不在AST中,但是有一個CursorKind似乎是apropriate(CXCursor_LinkageSpec)Clang AST:extern LinkageSpec問題

我的意思是,像extern int foo;解析代碼時,我只能找到在AST我的變量foo而不是其聯動規格的單線索。

我錯過了什麼?
問候

回答

3

類VarDecl有一個成員函數: 布爾hasExternalStorage()const的 它告訴你的變量是否是的extern與否。

我正在使用clang的C++庫。希望它能幫助你的Python工作。

+0

而對於功能(FunctionDecl)有[getStorageClass(https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html#a6d1ca48abb2608409dcd2a9261d555bc),您可以檢查是否它等於SC_Extern('clang :: StorageClass :: SC_Extern') – sinelaw 2017-07-11 12:59:30

1

位A necroanswer的,但如果你去到鐺\ LIB \塞瑪\ SemaCodeComplete.cpp(在\ LLVM \工具\如果按照LLVM的安裝說明),並添加以下行:

case Decl::LinkageSpec: return CXCursor_LinkageSpec; 

在交換機:

CXCursorKind clang::getCursorKindForDecl(const Decl *D) 

應該解決鐺的Python的粘結劑的返回而不是正確的LINKAGE_SPEC UNEXPOSED_DECL問題。此更改是在修訂版183352(2013-06-05)進行的。從我的版本

例子:

CXCursorKind clang::getCursorKindForDecl(const Decl *D) { 
if (!D) 
    return CXCursor_UnexposedDecl; 

switch (D->getKind()) { 
    case Decl::Enum:    return CXCursor_EnumDecl; 
    case Decl::LinkageSpec: return CXCursor_LinkageSpec; 
    // ...... 
+0

這個改變多次提出,最近由我提出,但似乎沒有人足夠接受它。嘆。 – Cameron 2016-06-09 18:53:07

+0

@Cameron 3年了,這個問題還是一回事?讓人驚訝。 – Jerdak 2016-06-21 17:51:59