C++ 如何获取枚举元素';s使用libclang的数值?

C++ 如何获取枚举元素';s使用libclang的数值?,c++,enums,libclang,C++,Enums,Libclang,假设我有一个枚举定义,例如: // myenum.h enum MyEnum { First = 1, Second, Third, TwoAgain = Second }; 我想通过编程从任何给定的枚举定义生成一个映射,其中键是枚举元素的名称,值是枚举元素的数值(例如,myMap[“Twoore”]==2) 到目前为止,我知道如何使用clangu-visitChildren()遍历源文件,并使用clangu-tokenize()提取单个令牌。通过AST递归,我

假设我有一个枚举定义,例如:

// myenum.h
enum MyEnum {
    First = 1,
    Second,
    Third,
    TwoAgain = Second
};
我想通过编程从任何给定的枚举定义生成一个映射,其中键是枚举元素的名称,值是枚举元素的数值(例如,
myMap[“Twoore”]==2

到目前为止,我知道如何使用
clangu-visitChildren()
遍历源文件,并使用
clangu-tokenize()
提取单个令牌。通过AST递归,我得到以下顺序的游标/标记:

  • “MyEnum”(CXType_枚举)
    • “第一”(CXU标识符)
    • “=”(CXToken\u标点符号)
    • “1”(CXToken_文字)
  • “无符号整数”(CXType\U UInt)
    • “1”(CXToken_文字)
  • “MyEnum”(CXType_枚举)
    • “第二”(CXU标识符)
  • “MyEnum”(CXType_枚举)
    • “第三”(CXU标识符)
  • “MyEnum”(CXType_枚举)
    • “再次出现”(CXToken_标识符)
    • “=”(CXToken\u标点符号)
    • “第二”(CXU标识符)
  • “无符号整数”(CXType\U UInt)
    • “第二”(CXU标识符)

  • 我想我可以写一个算法,使用这些信息来计算每个值。然而,我想知道是否有更简单的方法我可以直接从libclang API获取数值吗?

    正如id256所说,我认为你不能用
    libclang
    来实现这一点。但是,Clang允许您访问AST并直接对其进行操作。对于枚举,您需要查看
    EnumDecl
    类,它允许您迭代内部decl。然后,它只是一个构建地图的例子,如:

    for (auto declIterator = myEnumDecl.decls_begin();
         declIterator != myEnumDecl.decls_end();
         ++declIterator)
    {
        myMap[declIterator->getNameAsString()] = declIterator->getInitVal;
    }
    

    libclang通过和公开此信息。可以通过访问
    CXCursor\u EnumDecl
    的子级来构建您描述的地图:

    static enum CXChildVisitResult VisitCursor(CXCursor cursor, CXCursor parent, CXClientData client_data) {
        if (cursor.kind == CXCursor_EnumConstantDecl) {
            CXString spelling = clang_getCursorSpelling(cursor);
            myMap[clang_getCString(spelling)] = clang_getEnumConstantDeclValue(cursor);
            clang_disposeString(spelling);
        }
    
        return CXChildVisit_Continue;
    }
    

    在获取地图的名称和值时,可以使用以下方法。我用的是叮当声8

    bool VisitEnumDecl(EnumDecl *ED)
          {
    
            for (auto it = ED->enumerator_begin(); it != ED->enumerator_end(); it++)
            {
    
    
             std::cout <<it->getNameAsString()<<" "<<it->getInitVal().getSExtValue()<<std::endl;
    
    
            }
            return true;
          }
    
    bool VisitEnumDecl(EnumDecl*ED)
    {
    对于(自动it=ED->枚举器_begin();it!=ED->枚举器_end();it++)
    {
    
    std::我很感谢您提供了一个替代解决方案,@TartanLlama!我有点怀疑这超出了
    libclang
    的范围,但是有了确认和替代方案是很好的。实际上,通过
    libclang
    是可能的。请看@MattStevens的答案。太好了,@MattStevens;谢谢!我们真的无法得到任何更简单的c比这更瘦。我曾尝试使用CXTypeKind,但不知何故我错过了CXCursorKind。