自动化导出函数
目标:找到头文件里所有的函数,生成其他语言接口或文档
1. 手搓 python+正则
对于简单的,还行
对于复杂函数,正则过于复杂
处理 int* a int *a int a[3] 虽然是完全相同的作用,但是要画大量时间来区别,这还只是函数的部分
我之前的操作都是,先把文件拿过来,手工整理一下格式,比如,所有函数都换到同一行等等
然后用 python 跑一遍
跑完再手工筛选一次有问题的(比如枚举啦,有默认参数的啦)
2.Clang 工具链
Clang 是编译器,功能必然是最强大的
但是,如果你想从 Clang 的分析里拿数据,实际上不好拿
(1)用 Clang 类库,写 C++去调
我都没调成功过,它这里太深奥了,一时搞不清
(2)直接用 Clang 小工具 exe
-ast-dump参数,可以输出一个 XML,但是这个 XML 是非常复杂的,想解析,必须先学会 Clang 的 AST 构建标准,不然不好理解
而且 Clang 经常要求先通过编译,不能只看头文件,不灵活
3、其它工具
CastXML 没成功
4、Doxygen
Doxygen它不需要编译,解析速度比较快,生成的内容有 XML
然后撰写 Python 脚本,解析 XML,提取参数类型,也比较的容易
它可以用 memberdef 区分函数
每个函数第一个 type 是返回值
而 name 是名字
多个 param 字段决定了形参,均包含类型和名字
pygments
pygments 虽然比较易于使用,但是产生的内容不符合需求
比如:
txt
Name, HRESULT
Whitespace,
, __stdcall
Whitespace,
Name, Tool_set_tcp_posture返回值和函数名字都叫 Name,无法区分
总结
无论任何方法,都要自己做变量映射表
这个是不可避免的,任何工具,只是解析 C++,它又不知道你后续做什么
知道做什么的,比如 Swig,那种需要一开始就用,半途用的话,接口全变了
Doxygen
他这里基本上可以做到,因为