【问题标题】:Is there a mechanism for C++ like macros in haxe?haxe 中是否有类似 C++ 的宏机制?
【发布时间】:2025-12-15 21:40:02
【问题描述】:

在 C++ 中,我有如下宏:

#ifdef DEBUG
    #define dbgAssert(condition, message)/
    if(!(condition)){ implementation.Assert(message); }
#else
    #define dbgAssert(condition, message)
#endif

这种方法很有效,因为如果我们不处于调试模式,则永远不会测试条件,特别是当某些条件可能对 CPU 造成特别严重的影响时。

有没有办法在 Haxe 中实现这种类型的 one liner?

这是一个非常简单的示例,因为有一些宏具有十几个条件定义(取决于多个参数),我无法有效地维护所有地方的冗余重定义。

这是一个稍微有趣的系统,它允许我始终测试最简单的条件并根据级别添加更重的测试:

#if 4 == ASSERT4LEVEL
    #define lvlAssert4(conditionlvl1, conditionlvl2, conditionlvl3, conditionlvl4, message)/
    myAssert((conditionlvl1) && (conditionlvl2) && (conditionlvl3) && (conditionlvl4), message)
#elif 3 == ASSERT4LEVEL 
    #define lvlAssert4(conditionlvl1, conditionlvl2, conditionlvl3, conditionlvl4, message)/
    myAssert((conditionlvl1) && (conditionlvl2) && (conditionlvl3), message)
#elif 2 == ASSERT4LEVEL 
    #define lvlAssert4(conditionlvl1, conditionlvl2, conditionlvl3, conditionlvl4, message)/
    myAssert((conditionlvl1) && (conditionlvl2), message)
#else
    #define lvlAssert4(conditionlvl1, conditionlvl2, conditionlvl3, conditionlvl4, message)/
    myAssert((conditionlvl1), message)
#endif

如何在不执行条件的情况下复制此行为?

【问题讨论】:

    标签: macros compilation haxe conditional-compilation


    【解决方案1】:

    您可以根据调试标志创建 2 个不同的函数。 release 函数应该是内联的,并且应该什么都不做。

        class Debug {
            #if debug
            public static function assert (e:Bool) {
                if (!e) throw "assert";
            }
            #else
            public static inline function assert (e:Bool) {
                return;
            }
            #end
    
        }
    

    您还应该看看 haxe 宏,它可以在编译期间做很多强大的事情。

    【讨论】:

      【解决方案2】:

      对于这种情况,Frabbits 的答案是正确的,但这里也是宏版本。

      @:macro static public function dbgAssert(condition, message) {
           #if debug
           return macro if (!($condition)) { implementation.Assert($message); }
           #else
           return macro {};
           #end
      }
      

      【讨论】:

        最近更新 更多