【问题标题】:Clang Const Qualified C++ MethodClang Const 限定的 C++ 方法
【发布时间】:2012-03-23 16:18:32
【问题描述】:

如何测试 c++ 方法在 clang 中是否为 const 限定?

例如::

class Inner{
public:
    int i;
    Inner();
    float inner_method() const;
};

我正在使用 clang-c 库,并尝试在 inner_method 节点上使用 clang_isConstQualifiedType。但是这会返回 false。

我不介意答案是否使用 clang c++ 标头。

【问题讨论】:

    标签: clang


    【解决方案1】:

    在 C++ 接口中,检查这个的方法是使用CXXMethodDecl::getTypeQualifiers(),或者使用FunctionProtoType::getTypeQuals()(取决于你是否有声明或类型)。 Qualifiers::Const 位表示方法(或方法类型)是否为 const。

    在libclang C API中,这个信息似乎只用在getCursorUSR的实现中,其结果并不打算被解析,所以使用C++ API或者提交补丁来将这个功能添加到C API是最好的选择。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但我需要在没有 C++ API 的情况下执行此操作。我将我的解决方案放在下面以供将来参考。这个想法是使用 libclang 标记化功能来遍历方法的所有限定符:

      std::string GetClangString(CXString str)
      {
        const char* tmp = clang_getCString(str);
        if (tmp == NULL)
        {
          return "";
        }
        else
        {
          std::string translated = std::string(tmp);
          clang_disposeString(str);
          return translated;
        }
      }
      
      void GetMethodQualifiers(CXTranslationUnit translationUnit,
                               std::set<std::string>& qualifiers,
                               CXCursor cursor)
      {
        qualifiers.clear();
      
        CXSourceRange range = clang_getCursorExtent(cursor);
        CXToken* tokens;
        unsigned int numTokens;
        clang_tokenize(translationUnit, range, &tokens, &numTokens);
      
        bool insideBrackets = false;
        for (unsigned int i = 0; i < numTokens; i++)
        {
          std::string token = GetClangString(clang_getTokenSpelling(translationUnit, tokens[i]));
          if (token == "(")
          {
            insideBrackets = true;
          }
          else if (token == "{" || token == ";")
          {
            break;
          }
          else if (token == ")")
          {
            insideBrackets = false;
          }
          else if (clang_getTokenKind(tokens[i]) == CXToken_Keyword && 
                   !insideBrackets)
          {
            qualifiers.insert(token);
          }
        }
      
        clang_disposeTokens(translationUnit, tokens, numTokens);
      }
      

      然后可以通过以下命令检查由cursor 索引的方法是否声明为const

      std::set<std::string> qualifiers;
      GetMethodQualifiers(translationUnit, qualifiers, cursor);
      bool isConstant = (qualifiers.find("const") != qualifiers.end());
      

      【讨论】:

        【解决方案3】:

        我提供了代码in this SO answer,其中包含clang_getCursorUSR 的解析代码(基于LLVM 3.1 的源代码)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          • 2019-04-28
          • 2012-12-28
          • 1970-01-01
          相关资源
          最近更新 更多