Macros C+有机制吗+;像haxe中的宏? 在C++中,我有宏: #ifdef调试 #定义dbgAssert(条件、消息)/ if(!(条件)){implementation.Assert(message);} #否则 #定义dbgAssert(条件、消息) #恩迪夫

Macros C+有机制吗+;像haxe中的宏? 在C++中,我有宏: #ifdef调试 #定义dbgAssert(条件、消息)/ if(!(条件)){implementation.Assert(message);} #否则 #定义dbgAssert(条件、消息) #恩迪夫,macros,compilation,haxe,conditional-compilation,Macros,Compilation,Haxe,Conditional Compilation,这种方法是有效的,因为如果我们不在调试模式下,就永远不会测试条件,特别是当某些条件可能对CPU造成特别大的负担时 有没有办法在Haxe中实现这种类型的单行程序 这是一个非常简单的例子,因为有些宏有十几个条件定义(取决于多个参数),我无法有效地维护所有冗余的重新定义 这是一个稍微有趣的系统,它允许我始终测试最简单的条件,并根据级别添加更重的测试: #如果4==ASSERT4LEVEL #定义lvlAssert4(条件lvl1、条件lvl2、条件lvl3、条件lvl4、消息)/ myAssert((

这种方法是有效的,因为如果我们不在调试模式下,就永远不会测试条件,特别是当某些条件可能对CPU造成特别大的负担时

有没有办法在Haxe中实现这种类型的单行程序

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

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

#如果4==ASSERT4LEVEL
#定义lvlAssert4(条件lvl1、条件lvl2、条件lvl3、条件lvl4、消息)/
myAssert((conditionlvl1)和(conditionlvl2)和(conditionlvl3)和(conditionlvl4),消息)
#elif 3==ASSERT4LEVEL
#定义lvlAssert4(条件lvl1、条件lvl2、条件lvl3、条件lvl4、消息)/
myAssert((conditionlvl1)和&(conditionlvl2)和&(conditionlvl3),消息)
#elif 2==ASSERT4LEVEL
#定义lvlAssert4(条件lvl1、条件lvl2、条件lvl3、条件lvl4、消息)/
myAssert((conditionlvl1)和&(conditionlvl2),消息)
#否则
#定义lvlAssert4(条件lvl1、条件lvl2、条件lvl3、条件lvl4、消息)/
myAssert((conditionlvl1),消息)
#恩迪夫

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

您可以根据调试标志创建两个不同的函数。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宏,它可以在编译期间执行许多功能强大的操作。

您可以根据debug标志创建两个不同的函数。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宏,它可以在编译期间执行许多功能强大的操作。

Frabbits的答案对于这种情况是正确的,但下面是宏版本

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

Frabbits的答案在这种情况下是正确的,但这里也是宏版本

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