Clang AST:extern LinkageSpec问题

3
我目前正在使用clang的python绑定编写静态C++代码分析器,但是无论如何,我都无法在AST中找到某些内容是否为extern,尽管有一个CursorKind似乎是适当的(CXCursor_LinkageSpec)。
我的意思是,在解析类似extern int foo;的代码时,我只会在AST中找到变量foo,而没有任何关于它的链接说明的线索。
我错过了什么吗?
问候。
2个回答

3

虽然这个回答有点过时,但是如果你进入clang\lib\Sema\SemaCodeComplete.cpp(如果你遵循llvm的安装说明,在\llvm\tools\下),并添加以下行:

case Decl::LinkageSpec:  return CXCursor_LinkageSpec;

到交换机中:

CXCursorKind clang::getCursorKindForDecl(const Decl *D)

它应该解决clang的Python绑定程序返回UNEXPOSED_DECL而不是正确的LINKAGE_SPEC的问题。此更改是在修订版本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;
   // ......

1
这个改变已经被多次提出,最近一次是我提的,但似乎没有人在意到足够程度来接受它。唉。 - undefined
1
@Cameron 三年过去了,这个问题还存在?天啊。 - undefined

3

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

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


对于函数(FunctionDecl),可以使用getStorageClass来检查它是否等于SC_Extern(clang::StorageClass::SC_Extern)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接