0

構文を間違えたなどの理由でコンパイルエラーを意味するのではありません。C ++では、次の例のように、条件に基づいてコンパイル時エラーを作成できます。

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr, msg) { CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

int main(int argc, char* argv[])
{
    STATIC_CHECK(false, Compile_Time_Failure);
    return 0;
}

VS 2005では、これは次のように出力されます。

------ Build started: Project: Test, Configuration: Debug Win32 ------
Compiling...
Test.cpp
f:\temp\test\test\test.cpp(17) : error C2079: 'ERROR_Compile_Time_Failure' uses undefined struct 'CompileTimeError<__formal>'
        with
        [
            __formal=0
        ]
Build log was saved at "file://f:\temp\Test\Test\Debug\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Javaでこれを実現する方法はありますか?

4

4 に答える 4

2

別のツールを使用せずに、Javaでコンパイル時ロジックに基づいてアクションを生成する方法はありません。技術的には、JavaでCプリプロセッサを使用することは可能ですが、基礎となる言語に関する組み込みの仮定に注意する必要があります。もし私があなたなら、このコンパイル時エラーであなたがやろうとしていることを何でも達成するためのより良い方法を見つけるでしょう。必要に応じて、どうしても避けられない場合は、独自のプリプロセッサ(おそらくAPTを使用)を作成することもできます。

于 2008-09-18T00:48:24.863 に答える
2

Java でこれを行う方法はありません。C++ で機能するのと同じ方法ではありません。

おそらく注釈を使用し、コンパイルの前後にaptを実行して注釈を確認できます。

例えば:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}

次に、@MyStaticCheck アノテーションを探して引数を処理する独自の AnnotationProcessorFactory を作成します。

注: 私は apt であまり遊んだことがありませんが、ドキュメントによると、これは非常に実行可能であるように見えます。

于 2008-09-18T06:45:29.093 に答える
0

少し前に質問がありましたが、少し似たような問題を(ある程度)解決したので、答えを投稿することにしました。

私のタスクの詳細では、異なる機能セットを持つ2つのアプリケーションを単一のコアライブラリから構築する必要があります(未使用のものはリンクされません)。関数セットの選択はpublic static final booleanフラグによって行われます。問題は、各アプリケーションで、コアライブラリに適切なフラグが設定されていることを確認したいということです。また、不適切な関数が有効になっている場合、アプリケーションはコンパイルされてコンパイル時エラーが発生することはありません。

私がこれまでに見つけた唯一の解決策は、フラグとともに最終変数をライブラリで宣言することですpublic static final int functionSet1 = 0;

アプリケーションパッケージに、健康診断でダミークラスを追加しました

ConditionalBuild.functionSet1 = 1;

すべてのfunctionSetX変数から、特定のビルドで1つだけが非ファイナルになりました。したがって、1つのアプリケーションだけがエラーなしでビルドプロセスを渡すことができます。これを達成するためのより良い方法はありますか?コメントで教えてください。

于 2012-06-21T12:57:44.187 に答える
0

Matt Quail が上で答えたように、注釈はXDocletと一緒に使用すると、ニーズに対応するのに適しています。その組み合わせにより、かなりの前処理、コード生成などが可能になります。

于 2008-09-18T08:54:27.363 に答える