当前位置: 首页 > news >正文

【Python】解析CPP类定义代码,获取UML类图信息

参考 & 鸣谢

  • CppHeaderParser - 官方文档
  • Python解析C++头文件
  • win10直接获得文件绝对路径的方法总结

目的

  • 解析CPP头文件中的类定义,获取UML中的属性。用于画UML类图。如下所示格式,图片来源-链接

  • 即获取,类名,成员函数,成员方法。
    • 后置函数返回值、参数类型。
    • +、-、# 区分不同的访问权限,public,private,protected。
  • 使用Python的CppHeaderPaser库完成CPP文件中类定义解析。

代码实现

import sys
import CppHeaderParser
import os
import shutil
import os
import retype_hash = {'private' : '- ','protected' : '# ','public' : '+ '}def get_mem_var(parse_conent,cur_class,target_type):for class_private_mem_var in parse_conent.classes[cur_class]['properties'][target_type]:# 组装private属性tmp_str = type_hash[target_type] + class_private_mem_var['name'] + ' : ' + class_private_mem_var['type']print(tmp_str)def get_mem_func(parse_conent,cur_class,target_type):# 遍历方法 - publicfor class_mem_func in parse_conent.classes[class_name]['methods'][target_type]:tmp_str = ''tmp_str = type_hash[target_type] + class_mem_func['name'] + '('# 遍历函数参数if len(class_mem_func['parameters']):  # 有参数p_cnt = len(class_mem_func['parameters'])tmp_cnt = 0for one_param in class_mem_func['parameters']:  # 一个函数的多个参数,分多行tmp_cnt = tmp_cnt + 1tmp_str = tmp_str + one_param['name'] + " : " + one_param['type']if tmp_cnt != p_cnt:tmp_str = tmp_str + ' , 'tmp_str = tmp_str + ')' + " : "# 组装返回值tmp_str = tmp_str + class_mem_func['rtnType']print(tmp_str)if __name__ == '__main__':while True:# file = input("文件路径: ")file = input("请输入头文件路径: ")dest_dir_path = './'# 源文件是否存在if os.path.exists(file):print()# 复制文件shutil.copy2(file,dest_dir_path)# 新的目标路径(file_path,file_name) = os.path.split(file)file = dest_dir_path + file_name# 拷贝的临时文件是否存在if os.path.exists(file):# 去除新文件中的中文tmp_new_content = ''with open(file,"r+",encoding='utf-8') as f:old_file_content = f.read()# print(old_file_content)tmp_new_content = re.sub('[\u4e00-\u9fa5]','',old_file_content)# 重新打开,清空写入with open(file,"w+",encoding='utf-8') as f:f.write(tmp_new_content)# 解析parse_conent = CppHeaderParser.CppHeader(file)# 遍历每个解析到的类for class_name in parse_conent.classes.keys():# 当前类print("###################################################")print(class_name + '\n')# 获取属性 - private - protected - publicget_mem_var(parse_conent, class_name, 'private')get_mem_var(parse_conent, class_name, 'protected')get_mem_var(parse_conent, class_name, 'public')print()# 获取方法 - private - protected - publicget_mem_func(parse_conent, class_name, 'private')get_mem_func(parse_conent, class_name, 'protected')get_mem_func(parse_conent, class_name, 'public')# 分割线,划分不同类print()print("###################################################")else:print("拷贝文件不存在")else:print("源文件文件不存在")# 结束后删除临时文件os.remove(file)

使用

获取文件路径

  • shift + 右键选择文件,点击复制文件路径,即可获取该文件的绝对路径。
  • 或者使用VSCode,Clion,右键选择文件,复制文件路径。

启动程序,输入路径即可。

  • 这个类内容太多了,这里就截取了一部分。
  • 类名,成员变量,成员方法之间用空行隔开。多个类直接用#隔开。


存在问题

  • 部分新特性解析错误,例如:
  // 定时触发的回调函数std::function<void()> tick_;// 处理消息的回调函数std::function<Status(proto::MessagePtr)> step_;

会识别为成员函数。


  • 不完善的地方
    • 构造函数析构函数的,返回值类型,为void,应该为空
    • 析构函数检测不到波浪号~


  • CppHeaderParser打开文件编码问题(已经解决),会提示如下报错
   headerFileStr = "".join(fd.readlines())
UnicodeDecodeError: 'gbk' codec can't decode byte 0x8c in position 830: illegal multibyte sequence

原因: 给定文件中有GBK无法表示的字符。例如中文。
解决方法(已在上述代码中使用): 拷贝文件,去掉其中的中文字符,保存文件,用GBK编码集保存。

相关文章:

【Python】解析CPP类定义代码,获取UML类图信息

参考 & 鸣谢 CppHeaderParser - 官方文档Python解析C头文件win10直接获得文件绝对路径的方法总结 目的 解析CPP头文件中的类定义&#xff0c;获取UML中的属性。用于画UML类图。如下所示格式&#xff0c;图片来源-链接 即获取&#xff0c;类名&#xff0c;成员函数&#x…...

Docker存储驱动之- overlay2

docker支持多种graphDriver&#xff0c;包括vfs、devicemapper、overlay、overlay2、aufs等等&#xff0c;其中最常用的就是aufs了&#xff0c;但随着linux内核3.18把overlay纳入其中&#xff0c;overlay的地位变得更重&#xff0c;最近也在自己的虚拟机上用overlay2作为docker…...

Vue3 shallowRef 和 shallowReactive

一、shallowRef 使用shallowRef之前需要进行引入&#xff1a; import { shallowRef } from vue; 使用方法和ref 的使用方法一致&#xff0c;以下是二者的区别&#xff1a; 1. 如果ref 和 shallowRef 都传入的是普通数据类型的数据&#xff0c;那么他们的效果是一样的&#x…...

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…...

ASP.NET 开发几个知识点

1、 皮肤设定&#xff1a; 项目右键&#xff0c;建立皮肤 app_themes 文件夹&#xff0c;右键 建立 web from 皮肤文件&#xff0c; 设定皮肤样式。全局使用皮肤 web.config 增加 <pages styleSheetTheme"Skin1" /> &#xff0c;或在 具体页面 头 增加 sty…...

企业微信H5开发遇到的坑

企业微信官方推荐wx.agentConfig引用<script src"https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>是没有效果的 必须引用以下代码才有效果&#xff0c;这也是我看了社区的回答才有所收获&#xff0c;是一个坑 且VUE引用在线的…...

mysql使用--分组查询

1.分组数据 _1.复杂的数据统计 如&#xff1a;SELECT AVG(score) FROM student_score WHERE subject ‘Mysql是怎样运行的’; 上述实现查询指定课程的平均成绩。对FROM得到的结果集1&#xff0c;通过WHER进一步过滤得到结果集2。对结果集2中每一行执行汇总计算。 _2.创建分组 …...

Android网络模块基本实现步骤

Android网络模块主要是用于访问网络和获取数据&#xff0c;下面是网络模块的基本实现步骤&#xff1a; 选择网络框架&#xff1a;Android中常用的网络框架有HttpURLConnection、OkHttp、Volley和Retrofit等。最新的版本已经支持使用Kotlin协程完成网络请求&#xff0c;可以根据…...

Rust6.2 An I/O Project: Building a Command Line Program (mini_grep)

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 12: An I/O Project: Building a Command Line Program project: minigrep src/main.r…...

云轴科技ZStack信创云平台支撑长江航务管理局35套航运管理系统

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…...

Canal+Kafka实现MySQL与Redis数据同步(一)

CanalKafka实现MySQL与Redis数据同步&#xff08;一&#xff09; 前言 在很多业务情况下&#xff0c;我们都会在系统中加入redis缓存做查询优化。 如果数据库数据发生更新&#xff0c;这时候就需要在业务代码中写一段同步更新redis的代码。 这种数据同步的代码跟业务代码糅合…...

集合的运算

集合的运算 #include <stdio.h> #include <stdlib.h> void print(int size, char arr[]) {if (size 0) {printf("null");}for (int i 0; i < size; i) {printf("%c", arr[i]);}printf("\n"); } int main() {char U[] { a,b,c,…...

在MySQL上实现间隔5分钟汇总取数及相关字符串、时间处理方法实践

1. 实践案例需求描述 查询mysql数据库&#xff0c;按每5分钟分组获取3个小时内的电量数据&#xff0c;参考SQL语句如下。 select sd.RecordTime RecordTime, sd.sddl sddl,sd.pvdl ,cap.capdl capdl from ((SELECT CONCAT(DATE_FORMAT(RecordTime,%Y-%m-%d %H:), LPAD(floor(…...

什么是AIGC

1 定义 "AIGC"代表“人工智能生成内容”&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;它指的是使用人工智能&#xff08;AI&#xff09;技术自动生成的内容&#xff0c;这些内容可以包括文本、图像、音乐、视频或其他多媒体形式。…...

〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…...

GitHub Universe 2023:AI 技术引领软件开发创新浪潮

GitHub 是全球领先的软件开发和协作平台&#xff0c;数百万开发者和企业在此分享、学习和创建卓越的软件。同时 GitHub 处在 AI 技术前沿&#xff0c;通过其先进的 AI 技术增强开发者体验并赋能未来软件开发的使命。在今天的文章中&#xff0c;我们将一起看看在 GitHub 年度大会…...

数据结构:红黑树的插入实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 一、红黑树二、红黑树的插入三、代码实现总结 一、红黑树 红黑树的概念&#xff1a; 红黑树是一颗二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&…...

飞天使-django之数据库简介

文章目录 增删改查解决数据库不能存储中文问题创建表数据类型表的基本操作主键唯一键 unique外键实战 增删改查 四个常用的语句查询 : insert delete update select insert into student(Sno,name) values(95001,"张三") delete from student where name张三 upda…...

Flink之KeyedState

前面的文章中介绍过Operator State,这里介绍一下Keyed State. 在使用Operator State时必须要实现CheckpointFunction接口,而Keyed State则不需要,在使用keyBy(...)分组分组后,调用的函数必须是实现RichFuntion接口的函数才可以使用Keyed State.同样使用Keyed State也必须开启Ch…...

c语言:模拟实现qsort函数

qsort函数的功能&#xff1a; qsort相较于冒泡排序法&#xff0c;不仅效率更快&#xff0c;而且能够比较不同类型的元素&#xff0c;如&#xff1a;浮点数&#xff0c;结构体等等。这里我们来模拟下qsort是如何实现这一功能的&#xff0c;方便我们对指针数组有一个更深层次的理…...

Go语言的HTTP服务器:从基础到高级

Go语言的HTTP服务器&#xff1a;从基础到高级 HTTP 服务器的重要性 在现代 Web 开发中&#xff0c;HTTP 服务器是构建 Web 应用程序的核心组件。一个高性能、可靠的 HTTP 服务器可以&#xff1a; 处理客户端请求&#xff0c;返回响应支持各种 HTTP 方法和状态码提供路由和中…...

AI Agent 与传统AI区别:从被动响应到主动执行

AI Agent 与传统AI区别&#xff1a;从被动响应到主动执行&#x1f4dd; 本章学习目标&#xff1a;本章是入门认知部分&#xff0c;帮助零基础读者建立对AI Agent的初步认知。通过本章学习&#xff0c;你将全面掌握"AI Agent 与传统AI区别&#xff1a;从被动响应到主动执行…...

魔方财务批量拉取产品信息教程

使用魔方财务&#xff0c;有时候经常上级【变化了ip】或者批量【补时间】什么的&#xff0c;我们这里因为我们的财务换过域名&#xff0c;导致上级无法给我们推送需要我们手动拉取信息&#xff0c;一个两个还好&#xff0c;几百个怎么办&#xff1f; 本教程就是【欧云服务器】…...

Python数据可视化入门:从零开始掌握三大核心库

在数据科学领域&#xff0c;数据可视化是连接数据与洞见的关键桥梁。通过图表和图形&#xff0c;我们能够直观地理解数据模式、发现异常值、并向他人清晰传达分析结果。Python作为数据分析的主流语言&#xff0c;提供了丰富强大的可视化工具库。本文将带你从零开始&#xff0c;…...

航美实木板:以匠心守健康,用实力赢信赖——一位经销商的真情告白

“一张好的板材&#xff0c;守护的不是一个人&#xff0c;而是一个家庭的健康与幸福。”说这句话的汪总&#xff0c;是实木行业的“老炮儿”&#xff0c;深耕实木定制多年的他&#xff0c;对木材“热胀冷缩必变形开裂”的特性深信不疑。直到刷到航美实木板的宣传视频&#xff0…...

课堂行为及状态检测数据集11697张VOC+YOLO格式

课堂行为及状态检测数据集11697张VOCYOLO格式数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;11697 标注数量(xml文件个数)&#xff1a;1169…...

Linux网络诊断工具ping、traceroute等命令实战指南

在Linux系统的网络世界里&#xff0c;网络诊断工具就像是我们手中的“听诊器”&#xff0c;能够帮助我们精准地找出网络中存在的问题。今天&#xff0c;我们就来深入了解ping、traceroute等网络诊断命令的使用&#xff0c;通过实际操作和示例&#xff0c;让你轻松掌握使用这些工…...

软考高项-第六章-项目管理概论

项目和项目集重点在于正确的做事&#xff0c;项目组合在于做正确的事组织过程资产&#xff1a;过程资产&#xff0c;治理文件&#xff0c;数据资产&#xff0c;知识资产&#xff0c;安保和安全事业环境因素&#xff1a;市场条件&#xff0c;社会和文化影响因素&#xff0c;监管…...

3步打造个人数字时光机:GetQzonehistory备份QQ空间全攻略

3步打造个人数字时光机&#xff1a;GetQzonehistory备份QQ空间全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里承载青春记忆的说说突然消失&#xff1f;GetQ…...

个人学习实时数据管道框架--4 数据入湖实战

4.1 环境准备 1. 安装 Java 8+ 和 Maven 3.6+ 2. 下载项目代码:git clone <项目地址> 3. 配置环境变量:JAVA_HOME, HADOOP_HOME 4.2 配置文件 核心配置文件 application.properties: # Flink 配置 flink.job.name=VehicleSOCPipeline flink.parallelism=4 flink…...