【问题标题】:Conditional compilation based on Haxe compiler version?基于Haxe编译器版本的条件编译?
【发布时间】:2015-07-22 14:25:58
【问题描述】:

在 Haxe 中根据版本号进行条件编译的确切语法是什么?

根据haxe --help-defines,haxe 编译器版本的 haxedef 是“haxe-ver”,我假设它在代码中变成了“haxe_ver”。

所以我想检查版本号是否至少为 3.2.0。我最初尝试过:

#if (haxe_ver >= 3.2.0)

但这似乎不起作用。然后我尝试了:

#if !haxe_ver < 3.2.0

这似乎可以编译,但我想确定一下。

【问题讨论】:

    标签: haxe conditional-compilation


    【解决方案1】:

    嗯,这不是一个答案,但我确实看到很多不同的风格在我的 haxe 库中搜索:

    haxe-3.2.0/std/cpp/zip/Uncompress.hx:2: #if (haxe_ver < 3.4)
    haxe-3.1.3/std/neko/zip/Uncompress.hx:2: #if (haxe_ver < 3.2)
    haxe-3.1.3/lib/openfl/3,0,0-beta,3/openfl/Vector.hx:767: #if (haxe_ver > 3.101)
    haxe-3.1.3/lib/openfl/3,0,0-beta,3/docs/ImportAll.hx:926: #if (haxe_ver >= "3.2")
    haxe-3.1.3/lib/actuate/1,8,3/motion/actuators/GenericActuator.hx:61:  #if (haxe_209 || haxe3)
    

    快速测试:

    class Ver {
    
      macro public static function get_ver():haxe.macro.Expr {
        var rtn = haxe.macro.Context.definedValue("haxe_ver");
        return {expr: EConst(CString(rtn)) , pos : haxe.macro.Context.currentPos()};
      }
    
      static function main() {
        trace("haxe_ver: "+get_ver());
    #if (haxe_ver > "3.1.3")
        trace("haxe_ver > \"3.1.3\" - true");
    #else
        trace("haxe_ver > \"3.1.3\" - false");
    #end
    
    #if (haxe_ver > 3.130)
        trace("haxe_ver > 3.130 - true");
    #else
        trace("haxe_ver > 3.130 - false");
    #end
    
    #if (haxe_ver >= 3.20)
        trace("haxe_ver >= 3.20 - true");
    #else
        trace("haxe_ver >= 3.20 - false");
    #end
    
    #if (!haxe_ver < 3.10)
        trace("!haxe_ver < 3.10 - true");
    #else
        trace("!haxe_ver < 3.10 - false");
    #end
    
    #if (!(haxe_ver < 3.10))
        trace("!(haxe_ver < 3.10) - true");
    #else
        trace("!(haxe_ver < 3.10) - false");
    #end
    
      }
    }
    

    使用 Haxe 3.2 编译:

    Ver.hx:9: haxe_ver: 3.2
    Ver.hx:10: haxe_ver > "3.1.3" - true
    Ver.hx:16: haxe_ver > 3.130 - true
    Ver.hx:22: haxe_ver >= 3.20 - true
    Ver.hx:30: !haxe_ver < 3.10 - false
    Ver.hx:34: !(haxe_ver < 3.10) - true
    

    使用 Haxe 3.1.3 编译:

    Ver.hx:9: haxe_ver: 3.103
    Ver.hx:10: haxe_ver > "3.1.3" - true
    Ver.hx:18: haxe_ver > 3.130 - false
    Ver.hx:24: haxe_ver >= 3.20 - false
    Ver.hx:30: !haxe_ver < 3.10 - false
    Ver.hx:34: !(haxe_ver < 3.10) - true
    

    看起来:haxe_ver 是一个只有一个. 的字符串,这是字符串比较。您可以用引号将您的版本括起来,但存在三个问题

    • 如果您使用多个.,您将放弃比较。不要使用“3.1.3”
    • 如果你使用逻辑而不是!,你应该使用括号
    • 3.1.3(至少在我的环境中)报告haxe_ver = 3.103

    这些是安全的:

    #if (haxe_ver > 3.130)
    #if (haxe_ver <= 3.130)
    #if (haxe_ver < "3.200")
    #if (!(haxe_ver < 3.1))
    

    如果有帮助,here's 一个宏来打印所有定义:

    import haxe.macro.Expr;
    import haxe.macro.Context;
    
    // Note: Context.getDefines() requires Haxe 3.2 or later
    class Main {
    
      // - - - - - - - - - - - - - - - - - - - - - - - - - -
      macro public static function get_defines():Expr {
        var rtn = "Defines ("+
          (Context.defined("macro")?"macro":"standard")+" pass):\n";
        var defines:Map<String,String> = Context.getDefines();
        for (key in defines.keys()) {
          rtn += "-D "+key+"="+defines.get(key)+"\n";
        }
        trace(rtn); // compile-time trace
        return {expr: EConst(CString(rtn)) , pos : Context.currentPos()};
      };
      private static var __invoke_defines = get_defines();
      // - - - - - - - - - - - - - - - - - - - - - - - - - -
    
      static function main() {
      }
    }
    

    哪些输出:

    >haxe Main.hx -main Main -D foo=3
    Main.hx:15: Defines (macro pass):
    -D haxe_ver=3.2
    -D macro=1
    -D sys=1
    -D foo=3
    -D dce=std
    -D hxcpp_api_level=321
    -D true=1
    -D cross=1
    -D neko=1
    -D haxe3=1
    
    Main.hx:15: Defines (standard pass):
    -D haxe_ver=3.2
    -D sys=1
    -D foo=3
    -D dce=std
    -D hxcpp_api_level=321
    -D true=1
    -D cross=1
    -D haxe3=1
    

    【讨论】:

    • 你知道 Haxe 3.1.3 的定义是什么吗?
    • 我的定义列表器 (Context.getDefines) 未在 3.1.3 中实现,但我确实打印了上面的 haxe_ver -- 哎呀,现在我做了 -- 奇怪的是 3.103 在我的环境,即使 haxe -version 报告 3.1.3
    • 在内部 haxe_ver 被定义为十进制形式的字符串,而该字符串又派生自 version / 1000,其中 version3200 形式的整数,用于 haxe 3.2。将haxe_ver 用作done in the std lib 的“官方”方式只是将其视为一个int,例如#if (haxe_ver &lt;= 3.2).
    【解决方案2】:

    Haxe 支持条件编译中的字符串比较,如:

    #if ("a" < "b")
    

    haxe_ver 定义是一个字符串,所以你可以这样比较它:

    #if (haxe_ver < "3.2.0")
    

    由于是字符串比较,所以要小心改变位数会产生有趣的结果。例如,“10”小于“2”,因为它以“1”开头。只要你的变量是统一的,你应该没问题(“10 和 “02”有效)

    您也许可以将haxe_ver 比较为一个数字(即使它实际上是一个字符串),但我认为这只能工作到小数点后一位?

    #if (haxe_ver < 3.2)
    

    我认为字符串比较比较会更安全:)

    #if (haxe_ver < "3.2")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2014-05-10
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多