2

我目前正在使用 clang 的 python 绑定编写一个静态 C++ 代码分析器,由于某种原因,我extern无法在 AST 中找到某些东西,即使有一个似乎是适当的 CursorKind (CXCursor_LinkageSpec)

我的意思是,当像我这样解析代码时,extern int foo;我只会foo在 AST 中找到我的变量,而不是它的链接规范的单一线索。

我错过了什么?
问候

4

2 回答 2

3

类 VarDecl 有一个成员函数: bool hasExternalStorage () const 告诉你变量是否是外部的。

我正在使用 clang 的 C++ 库。希望它对您的 python 工作有所帮助。

于 2012-09-21T08:05:13.580 回答
1

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;
   // ......
于 2013-06-06T04:38:17.833 回答