我目前正在使用 clang 的 python 绑定编写一个静态 C++ 代码分析器,由于某种原因,我extern
无法在 AST 中找到某些东西,即使有一个似乎是适当的 CursorKind (CXCursor_LinkageSpec)
我的意思是,当像我这样解析代码时,extern int foo;
我只会foo
在 AST 中找到我的变量,而不是它的链接规范的单一线索。
我错过了什么?
问候
我目前正在使用 clang 的 python 绑定编写一个静态 C++ 代码分析器,由于某种原因,我extern
无法在 AST 中找到某些东西,即使有一个似乎是适当的 CursorKind (CXCursor_LinkageSpec)
我的意思是,当像我这样解析代码时,extern int foo;
我只会foo
在 AST 中找到我的变量,而不是它的链接规范的单一线索。
我错过了什么?
问候
类 VarDecl 有一个成员函数: bool hasExternalStorage () const 告诉你变量是否是外部的。
我正在使用 clang 的 C++ 库。希望它对您的 python 工作有所帮助。
Bit of a necroanswer but if you go in to clang\lib\Sema\SemaCodeComplete.cpp(in \llvm\tools\ if you follow llvm's installation instructions) and add the following line:
case Decl::LinkageSpec: return CXCursor_LinkageSpec;
To the switch in:
CXCursorKind clang::getCursorKindForDecl(const Decl *D)
It should resolve the issue of clang's Python binder returning UNEXPOSED_DECL instead of the correct LINKAGE_SPEC. This change was made at revision 183352(2013-06-05).
Example from my version:
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;
// ......