好的,各位观众老爷们,大家好!今天咱们来聊聊一个听起来就很高大上,但其实也没那么可怕的技术——C++ Clang Reflection API,也就是利用Clang AST进行编译期反射。
什么是编译期反射?
首先,咱们得搞清楚啥是反射。简单来说,反射就是程序在运行时检查自身结构的能力,比如知道自己有哪些类、哪些成员变量、哪些方法等等。这在动态语言里很常见,像Java、Python都支持。
但是,C++这老家伙,天生就是个静态类型语言,它的哲学是尽可能把检查都放在编译期,运行时就别瞎折腾了。所以,传统的C++是不支持反射的。
那编译期反射又是啥呢?就是把反射的功能搬到编译期去做!这样,我们就可以在编译的时候,就拿到C++代码的结构信息,然后根据这些信息生成一些代码,做一些骚操作。
为什么要用Clang AST?
C++编译的过程大致是:预处理 -> 编译 -> 汇编 -> 链接。其中,“编译”这个步骤,编译器会把C++代码转换成一种中间表示,叫做抽象语法树(Abstract Syntax Tree,简称AST)。AST就像一颗树,把代码的结构给完整地表示出来。
Clang就是个C++编译器,而且它很良心的提供了API,让我们能够访问和操作这个AST!这就意味着,我们可以在编译的时候,通过Clang API拿到C++代码的AST,然后分析这棵树,提取出我们需要的信息,比如类名、成员变量、方法等等。
Clang Reflection API能干啥?
有了编译期反射,我们就能做很多有趣的事情: