假设我有一个枚举定义,例如:
// myenum.h
enum MyEnum {
First = 1,
Second,
Third,
TwoAgain = Second
};
我想根据任何给定的枚举定义以编程方式生成映射,其中键是枚举元素的名称,值是枚举元素的数值(例如myMap["TwoAgain"] == 2
)
到目前为止,我知道如何使用 clang_visitChildren()
遍历源文件,并使用 clang_tokenize()
提取单个标记。通过 AST 递归,我按以下顺序获得游标/标记:
- “MyEnum”(CXType_Enum)
- “第一”(CXToken_Identifier)
- "="(CXToken_Punctuation)
- “1”(CXToken_Literal)
- “无符号整数”(CXType_UInt)
- “1”(CXToken_Literal)
- “MyEnum”(CXType_Enum)
- “第二”(CXToken_Identifier)
- “MyEnum”(CXType_Enum)
- “第三”(CXToken_Identifier)
- “MyEnum”(CXType_Enum)
- “TwoAgain”(CXToken_Identifier)
- "="(CXToken_Punctuation)
- “第二”(CXToken_Identifier)
- “无符号整数”(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/