windows下C++对象的反射功能

该博客介绍了一种方法,通过分析pdb文件获取C/C++结构体或类的变量信息,实现类似protobuf的序列化功能,简化日志中对象的查看。提供的demo展示了如何将类实例转换为JSON字符串,极大地减轻了开发者的工作负担。实现原理涉及对PDB文件的解析和对象的序列化过程。

概述

c/c++如果在日志中查看某个结构体/类的每个变量名,变量值信息,只能通过printf逐个格式化,非常繁琐,如何做到类似protobuff转json的序列化功能呢?

该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址,并将指定的对象序列化成完整json字符串,极大降低了开发者工作量。

demo效果

在release下执行tcdumpTest.exe 看效果

注意:使用前先看‘使用说明.txt’,需要先注册\DIA SDK\bin\msdia120.dll。

  • 定义类、结构体:
Class Ctest
{
Public:
    Int M_i = 1;
    Float M_f = 0.1;
    Double M_d = 0.2;
    Char M_c = 'a';
    Std::String M_str = "Hello World";
    Std::Vector<Int> M_v;
    Std::Map<Int, Std::String> M_map;
};
  • 赋值:
Ctest Test;
Test.M_v.Push_back(1);
Test.M_v.Push_back(2);
Test.M_v.Push_back(3);
Test.M_map.Insert({ 1,"hello" });
test.m_map.insert({ 2,"world" });
  • 初始化tcDump,并序列化对象
int ret = TCDUMP_INIT(R"(..\tcDumpTest.pdb)");
if (ret == 0) {
    std::cout << "load pdb failed !!!" << std::endl;
    return 0;
}
// 打印 test 变量内容,已json格式输出
auto retJson = TCDUMP(test);
if (NULL == retJson) {
    return false;
}
std::cout << retJson << std::endl;
  • 序列化结果retJson输出
    在这里插入图片描述

实现原理

https://www.91dengdeng.cn/2022/02/28/windows%E4%B8%8BC-%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%8F%8D%E5%B0%84%E5%8A%9F%E8%83%BD/#more

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡在床板下_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值