【问题标题】:Clang AST : extern LinkageSpec issueClang AST:外部 LinkageSpec 问题
【发布时间】:2012-08-08 13:21:03
【问题描述】:

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

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

我错过了什么?
问候

【问题讨论】:

    标签: c++ clang abstract-syntax-tree extern


    【解决方案1】:

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

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

    【讨论】:

    • 对于函数(FunctionDecl)有getStorageClass,你可以检查它是否等于SC_Extern(clang::StorageClass::SC_Extern
    【解决方案2】:

    有点 necroanswer 但如果你进入 clang\lib\Sema\SemaCodeComplete.cpp(如果你按照 llvm 的安装说明在 \llvm\tools\ 中)并添加以下行:

    case Decl::LinkageSpec:  return CXCursor_LinkageSpec;
    

    转入:

    CXCursorKind clang::getCursorKindForDecl(const Decl *D)
    

    它应该可以解决 clang 的 Python binder 返回 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;
       // ......
    

    【讨论】:

    • 此更改已被多次提出,最近一次是由我提出的,但似乎没有人愿意接受它。叹息。
    • @Cameron 3 年了,这个问题还在吗?哎呀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多