42 lines
1.9 KiB
Markdown
42 lines
1.9 KiB
Markdown
|
# 生成细节
|
|||
|
|
|||
|
autocxxpy核心分为三部分:
|
|||
|
* CXXParser:负责分析C++文件,输出defines,class,function,constants之类的信息
|
|||
|
* 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的结果。
|
|||
|
|