如何生成C++结构体/类的所有成员及类型的扁平化列表?
需求:生成C++类/结构体的扁平化成员输出
我需要为指定的C++结构体或类生成包含所有成员(含继承而来的成员)的扁平化输出,格式需清晰易解析,供其他工具调用使用。
示例
输入代码
class ParentClass { int a; std::string b; }; class MemberA { int foo; float bar; }; class MemberB { int baz; float bot; }; class MyClass : ParentClass { MemberA memberA1; MemberA memberA2; MemberB memberB; int top; };
期望输出
MyClass(ParentClass).a(int) MyClass(ParentClass).b(std::string) MyClass.memberA1(MemberA).foo(int) MyClass.memberA1(MemberA).bar(float) MyClass.memberA2(MemberA).foo(int) MyClass.memberA2(MemberA).bar(float) MyClass.memberB(MemberB).baz(int) MyClass.memberB(MemberB).bot(float) MyClass.top(int)
已尝试方案
- 解析PDB文件:使用Visual Studio 2019,但未得到满意结果
- C++中使用DIA:遇到COM相关问题,推测是公司IT政策限制导致
- Python的
pdbparse库:触发“Unsupported File Type”错误,该库未适配新版PDB格式 - C++20反射特性:尝试后未达到预期效果
下一步计划
- 深入研究C++20反射,尽管其复杂度较高
- 实现自定义Doxygen生成逻辑,利用Doxygen成熟的文档生成能力
问题
还有哪些值得尝试的实现方案?欢迎提供思路或建议!
额外可行方案建议
Clang工具链的LibTooling/Clang AST解析
基于Clang的抽象语法树(AST)编写自定义工具,直接解析C源码获取类的继承关系、成员变量类型及嵌套结构。Clang对C标准支持完善,能处理复杂的继承、嵌套类场景,输出结果精准。可直接用C++编写Clang插件,或借助clang-python绑定快速实现原型。GDB Python脚本
利用GDB的Python API加载目标程序或可执行文件,通过调试接口获取类的类型信息。GDB能解析调试符号,遍历类的继承链和成员变量,适合处理已编译完成的二进制文件场景。CodeQL查询
使用CodeQL对C++代码库做静态分析,编写查询规则提取类的继承关系、成员变量及其类型,再将查询结果格式化为目标输出格式。CodeQL支持复杂代码结构分析,适合批量处理代码库的场景。自定义预处理器/宏生成
借助C++宏定义,在代码中标记需要追踪的类和成员,通过预处理器生成包含成员信息的代码,编译时输出所需格式的文本。该方案需要修改源码添加宏标记,但实现简单,适用于可控的代码库场景。LLVM IR解析
编译代码生成LLVM IR,解析IR中的类型元数据,提取类的成员和继承信息。LLVM IR作为中间表示,结构规整、易于解析,适合跨编译器的场景。
内容的提问来源于stack exchange,提问作者A. Ocannaille
相关产品推荐
相关产品推荐

