c++ - 如何使用 libclang 获取枚举元素的数值?

标签 c++ enums libclang

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

// myenum.h
enum MyEnum {
    First = 1,
    Second,
    Third,
    TwoAgain = Second
};

我想根据任何给定的枚举定义以编程方式生成映射,其中键是枚举元素的名称,值是枚举元素的数值(例如myMap["TwoAgain"] == 2)

到目前为止,我知道如何使用 clang_visitChildren() 遍历源文件,并使用 clang_tokenize() 提取单个标记。通过 AST 递归,我按以下顺序获得游标/标记:

  1. “MyEnum”(CXType_Enum)
    • “第一”(CXToken_Identifier)
    • "="(CXToken_Punctuation)
    • “1”(CXToken_Literal)
  2. “无符号整数”(CXType_UInt)
    • “1”(CXToken_Literal)
  3. “MyEnum”(CXType_Enum)
    • “第二”(CXToken_Identifier)
  4. “MyEnum”(CXType_Enum)
    • “第三”(CXToken_Identifier)
  5. “MyEnum”(CXType_Enum)
    • “TwoAgain”(CXToken_Identifier)
    • "="(CXToken_Punctuation)
    • “第二”(CXToken_Identifier)
  6. “无符号整数”(CXType_UInt)
    • “第二”(CXToken_Identifier)

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

最佳答案

libclang 通过 clang_getEnumConstantDeclValue 公开此信息和 clang_getEnumConstantDeclUnsignedValue .可以通过访问 CXCursor_EnumDecl 的子项来构建您描述的 map :

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;
}

关于c++ - 如何使用 libclang 获取枚举元素的数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236534/

相关文章:

c++ - 比较两个矩阵Opencv的面积

c++ - 使用 Rcpp 查找重复项

enums - 如何创建一个获取枚举类型值的宏?

java - Java 中这两个 Enum 有什么区别

c++ - CLang Libtooling:获取 clang::VarDecl、clang::FieldDecl 或 clang::ParmVarDecl 内变量的数据类型

python - 无法运行libclang:错误“找不到指定的模块”

c++ - LibClang clang_getArgType() 返回错误的类型

c++ - 编译器是否消除了不必要的原子?

c++ - 尝试获取目标链接库信息时获取属性返回空变量

python - 在类 : TypeError: 'module' object is not callable 中定义 Enum 时出错