13

アサーションは、実行時にデバッグと本番環境でそれぞれ有効/無効にできることを知っています。ただし、アサーションによって生成されるバイナリのサイズも大きくなることがわかりました(以下の例では約100〜200バイト)。

#define NDEBUGCおよびC++では、 beforeを使用することで、コンパイル時にこれを実行できます#include <assert.h>

Javaコンパイラがこれを自動的に行う方法はありますか?後でデバッグするために、ソースコードに残しておきたいと思います。ただし、結果のバイナリが必要以上に大きくなることも望ましくありません(設計要件としてサイズ制限があります)。

Cコード:

//#define NDEBUG
#include <assert.h>

int main(void) {
    assert(0); // +200 bytes without NDEBUG, 0 with NDEBUG
    return 0;
}

Javaコード:

public class Test {
    public static void main(String[] args) {
        assert(System.nanoTime()==0); // increases binary size by about 200 bytes
    }
}

bn。の答えに応えて:

public class Test2 {
    public static final boolean assertions = false;

    public static void main(String[] args) {
        if(assertions) {
            assert(System.nanoTime()==0);
        }
    }
}

編集:実際、この有効化/無効化は、実行時よりもコンパイル時の機能の方が便利なようです。つまり、何人のエンドユーザーがそれらを有効にしますか?プログラマーがデバッグプロセス中に懸念している限り、とにかくコードを再コンパイルする可能性があります。

4

2 に答える 2

4

これは、組み込みのコンパイルステップとしては不可能です。ただし、アサーションの周囲に条件付きブロックを追加することでこれを行うことができます。

詳細については、 「クラスファイルからのアサーションのすべてのトレースの削除」の記事を参照してください。

于 2012-06-06T15:34:09.720 に答える
2

個人的には、ソースコードに複雑さが加わったため、次のことはしませんが、javacはmain 、次の2つのフラグメントでまったく同じ中間コードを生成しました。

条件付きアサート

class C {
    public final static boolean assertions = false;

    public static void main(String[] args) {
        if(assertions) {
            assert(System.nanoTime()==0);
        }
    }
}

アサートなし

class C {
    public static void main(String[] args) {
    }
}

コンパイルされたコード

  public static void main(java.lang.String[]);
    Code:
       0: return        
    LineNumberTable:
      line 3: 0

編集

実際、この有効化/無効化は、実行時よりも便利なコンパイル時の機能であるように思われます。つまり、何人のエンドユーザーがそれらを有効にしますか?

それらを有効にするのはエンドユーザーではなく、エンドユーザーにそれらを有効にするように指示するのはカスタマーサポートです。デフォルトでは無効ではなく有効になっていますが、希望します。

于 2012-06-06T16:07:07.217 に答える