vnpy/binding/generator/doc/converts.md

42 lines
1.9 KiB
Markdown
Raw Normal View History

2019-01-22 10:15:47 +00:00
# 生成细节
autocxxpy核心分为三部分
* CXXParser:负责分析C++文件输出definesclassfunctionconstants之类的信息
* PreProcessor:负责分析CXXParser的结果对一些特别的量进行识别比如定义成常量的define一个类是否是纯类等等
* Generator:负责生成代码
## 生成过程
要使用这个生成器首先指定要分析的头文件使用CXXParser分析。
```python
r0: CXXParseResult = CXXParser([self.md_header, self.td_header]).parse()
```
然后将结果传入预处理器
```python
r1: PreProcessorResult = PreProcessor(r0).process()
```
最后将第一步和第二部的结果一起传入Generator。
注意除了classes以外所有参数都可以置空或者仅从第一步提取。
最终返回的是一组字典```Dict[str, str]```,记录着生成的文件名和对应的内容。
用户只需要江这些结果保存下来即可。
```python
options = GeneratorOptions(
typedefs=r0.typedefs,
constants=r0.variables & r1.const_macros,
functions=r0.functions,
classes=r1.classes,
dict_classes=r1.dict_classes,
enums=r0.enums,
)
```
## Q & A
### 为什么会有PreProcessor
理想情况下一个cxx到pyd的生成器应该是只需要提供头文件即可生成正确的pyd文件。
但是cxx语法丰富包容各种写法。虽然主流写法大体是一致的但是我们也不能忽视大量非主流写法的存在。要包容所有的写法是一件比较困难的事情。
这些写法虽然不会导致最终无法生成pyd但是会导致pyd难以使用或者使得最终生成的文件效率低下。
例如有些人可能会用define定义常量或者内联函数。忽略掉这些东西显然会降低我们的python端的代码体验。
所以我们使用PreProcessor将一些分析奇葩写法得到的结果转换成主流写法的结果。
如果你觉得这些转化是多余的你可以不使用PreProcessor的结果。