0

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

条件を実行せずにこの動作を再現するにはどうすればよいですか?

4

2 に答える 2

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 マクロも検討する必要があります。

于 2013-02-08T12:32:48.167 に答える
2

Frabbits の回答はこの状況では正しい回答ですが、マクロ版もここにあります。

@:macro static public function dbgAssert(condition, message) {
     #if debug
     return macro if (!($condition)) { implementation.Assert($message); }
     #else
     return macro {};
     #end
}
于 2013-02-09T00:19:55.110 に答える