Java で条件付きコンパイル時エラーが発生する
-
01-07-2019 - |
質問
構文ミスなどによるコンパイルエラーのことではありません。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でこれを実現する方法はありますか?
解決
これを Java で行う方法はなく、C++ で行う方法と同じではありません。
おそらく注釈を使用して実行できます 適切な コンパイルの前後に注釈を確認してください。
例えば:
@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
return;
}
次に、 @MyStaticCheck アノテーションを検索し、引数を使用して何らかの処理を行う独自の AnnotationProcessorFactory を作成します。
注記:私は apt をあまり使ったことはありませんが、ドキュメントを見ると、これは非常に実行可能であるようです。
他のヒント
別のツールを使用せずに、Java のコンパイル時ロジックに基づいてアクションを生成する方法はありません。技術的には、それは 可能 Java 上で C プリプロセッサを使用するには、基礎となる言語に関する組み込みの前提に注意する必要があります。私があなただったら、このコンパイル時エラーであなたがやろうとしていることを達成するためのより良い方法を見つけるでしょう。必要に応じて、独自のプリプロセッサを作成することもできます (おそらく、 APT)それが本当に避けられない場合。
Matt Quail が上で答えたように、注釈は、 Xドックレット, 、ニーズに応えるのに適しています。この組み合わせにより、かなりの前処理やコード生成などが可能になります。
質問は少し前に行われたものですが、(ある程度)似たような問題を解決したため、回答を投稿することにしました。
私のタスクの詳細では、異なる関数セットを持つ 2 つのアプリケーションを 1 つのコア ライブラリから構築する必要があります (未使用のものはリンクしないようにします)。関数セットの選択は次のように行われます。 public static final boolean
フラグ。問題は、各アプリケーションで、コア ライブラリに適切なフラグを設定してビルドされていることを確認したいことです。また、不適切な機能が有効になっている場合、アプリケーションはコンパイルできず、コンパイル時エラーが発生します。
私がこれまでに見つけた唯一の解決策は、ライブラリ内でフラグとともにfinal変数を宣言することです。 public static final int functionSet1 = 0;
, 、など。
アプリケーションパッケージにチェック機能を備えたダミークラスを追加しました
ConditionalBuild.functionSet1 = 1;
すべての functionSetX 変数のうち、特定のビルドで非最終的な変数となったのは 1 つだけです。したがって、エラーなしでビルド プロセスを通過できるアプリケーションは 1 つだけです。これを達成するためのより良い方法はありますか?コメントでお知らせください。