Skip to content

自动化导出函数

目标:找到头文件里所有的函数,生成其他语言接口或文档

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

他这里基本上可以做到,因为