多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
类型的构建顺序是不确定的,这延伸到构建宏的执行顺序。虽然可以确定一些规则,我们强烈建议不要依赖构建宏的执行顺序。如果类型构建需要多次传递,这应该被直接反映到宏代码中。为了避免相同类型多次执行构建宏,状态可以被存储到静态变量或者添加为元数据到涉及到的类型: ~~~ import haxe.macro.Context; import haxe.macro.Expr; #if !macro @:autoBuild(MyMacro.build()) #end interface I1 { } #if !macro @:autoBuild(MyMacro.build()) #end interface I2 { } class C implements I1 implements I2 { } class MyMacro { macro static public function build():Array<Field> { var c = Context.getLocalClass().get(); if (c.meta.has(":processed")) return null; c.meta.add(":processed",[],c.pos); // process here return null; } } class Main { static public function main() { } } ~~~ 接口 I1 和 I2 都有 :autoBuild 元数据,构建宏对于 C类执行两次。我们通过添加一个自定义的 :processed 元数据到类来防止多次处理,在第二次的宏执行中可以被检查: