2008-09-18 48 views
0

我不是指編譯錯誤,因爲我犯了一個語法錯誤或任何其他錯誤。在C++中,我們可以創建編譯時錯誤基礎上的條件,如下面的例子:在Java中產生條件編譯時錯誤

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中實現這一目標?

回答

2

在Java中沒有辦法做到這一點,而不是以它在C++中爲你工作的方式。

您也許可以使用註釋,並在編譯之前或之後運行apt以檢查註釋。

例如:

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

,然後寫你自己的AnnotationProcessorFactory是看了@MyStaticCheck註釋,並執行與參數的東西。

注意:我沒有使用apt進行過多操作,但文檔使它看起來像這樣非常有用。

2

如果不使用單獨的工具,沒有辦法根據Java中的編譯時邏輯產生任何動作。從技術上講,它可能是在Java上使用C預處理器,但您必須小心其內置的有關底層語言的假設。如果我是你,我會找到一個更好的方法來完成你要用這個編譯時錯誤所做的任何事情。如果有必要的話,你甚至可以編寫你自己的預處理器(可能使用APT),如果它真的是不可避免的。

0

正如馬特鵪鶉回答上面,註釋,以及XDoclet,適合滿足您的需求。這種組合允許進行相當多的預處理,代碼生成等。

0

雖然前一段時間問過這個問題,但我決定發佈我的答案,因爲我解決了(在某種程度上)一個類似的問題。

我的任務的具體情況需要兩個具有不同功能集的應用程序,這些應用程序可以從單個核心庫(以及未使用的未連接的東西)構建而成。功能集的選擇由public static final boolean標誌進行。問題是我想確保在每個應用程序中,它都是在覈心庫中設置了一個適當的標誌。如果啓用了不正確的函數,則應用程序不應編譯,從而導致編譯時錯誤。

到目前爲止我發現的唯一的解決辦法是在庫最後變量聲明與標誌位:public static final int functionSet1 = 0;

在應用程序包我添加了一個虛設類與覈對

ConditionalBuild.functionSet1 = 1; 

從所有的functionSetX變量中,只有一個在特定的版本中不是最終的。因此只有一個應用程序可以傳遞構建過程而不會出現錯誤。有沒有更好的方法來實現這一目標?請在評論中告訴我。