如何使用libclang解析CXCursor_FieldDecl获取成员字段的类型与名称?
问题:解析CXCursor_FieldDecl获取成员字段的类型与名称
我正借助Clang的lambda示例解析C++头文件,目前已能识别CXCursor_FieldDecl并输出字段名称,但无法获取成员字段的类型。现有代码如下:
clang_visitChildren(cursor, [](CXCursor c, CXCursor parent, CXClientData client_data) { if (clang_getCursorKind(c) == CXCursor_FieldDecl) { std::cout << clang_getCursorKindSpelling(clang_getCursorKind(c)) << " " << clang_getCursorSpelling(c) << ";\n"; } return CXChildVisit_Recurse; }, nullptr);
当前输出结果为:
FieldDecl varA; FieldDecl varB; FieldDecl varC;
我期望得到的输出是:
int varA; double varB; string varC;
请问如何解析CXCursor_FieldDecl以获取成员字段的类型与名称?
解决方案
要获取CXCursor_FieldDecl的字段类型,需借助Clang提供的类型查询函数,修改后的代码如下:
clang_visitChildren(cursor, [](CXCursor c, CXCursor parent, CXClientData client_data) { if (clang_getCursorKind(c) == CXCursor_FieldDecl) { // 获取字段的类型对象 CXType fieldType = clang_getCursorType(c); // 将类型转换为可读字符串 CXString typeSpelling = clang_getTypeSpelling(fieldType); // 获取字段名称字符串 CXString nameSpelling = clang_getCursorSpelling(c); // 输出类型与名称 std::cout << clang_getCString(typeSpelling) << " " << clang_getCString(nameSpelling) << ";\n"; // 释放Clang返回的CXString资源,避免内存泄漏 clang_disposeString(typeSpelling); clang_disposeString(nameSpelling); } return CXChildVisit_Recurse; }, nullptr);
核心要点:
clang_getCursorType(c):传入CXCursor_FieldDecl游标,返回该字段对应的CXType类型对象。clang_getTypeSpelling(fieldType):将CXType转换为对应的类型名称字符串(如int、double)。- 内存管理:Clang返回的
CXString是内部分配的资源,必须调用clang_disposeString()手动释放,否则会引发内存泄漏。
修改后即可输出你期望的格式,正确获取并展示字段的类型与名称。
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

