在C ++中我有像:
这样的宏#ifdef DEBUG
#define dbgAssert(condition, message)/
if(!(condition)){ implementation.Assert(message); }
#else
#define dbgAssert(condition, message)
#endif
这种方法很有效,因为如果我们没有处于调试模式,特别是当某些条件在CPU上特别沉重时,从未测试过该条件。
有没有办法在Haxe中实现这种类型的一个衬垫?
这是一个非常简单的例子,因为有一些带有十几个条件定义的宏(取决于多个参数)我无法在整个地方有效地维护冗余重新定义。
这是一个稍微有趣的系统,它允许我总是测试最简单的条件,并根据级别添加更重的测试:
#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
如何在不执行条件的情况下复制此行为?
答案 0 :(得分:3)
您可以根据调试标志创建2个不同的功能。释放功能应该是内联的,不应该做任何事情。
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宏,它可以在编译期间做很多有用的事情。
答案 1 :(得分:2)
对于这种情况,Frabbits答案是正确的,但这里也是宏版本。
@:macro static public function dbgAssert(condition, message) {
#if debug
return macro if (!($condition)) { implementation.Assert($message); }
#else
return macro {};
#end
}