1.9 KiB
1.9 KiB
生成细节
autocxxpy核心分为三部分:
- CXXParser:负责分析C++文件,输出defines,class,function,constants之类的信息
- PreProcessor:负责分析CXXParser的结果,对一些特别的量进行识别,比如定义成常量的define,一个类是否是纯类等等
- Generator:负责生成代码
生成过程
要使用这个生成器,首先指定要分析的头文件,使用CXXParser分析。
r0: CXXParseResult = CXXParser([self.md_header, self.td_header]).parse()
然后将结果传入预处理器
r1: PreProcessorResult = PreProcessor(r0).process()
最后将第一步和第二部的结果一起传入Generator。
注意:除了classes以外,所有参数都可以置空或者仅从第一步提取。
最终返回的是一组字典Dict[str, str]
,记录着生成的文件名和对应的内容。
用户只需要江这些结果保存下来即可。
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的结果。