在Java中产生条件编译时错误

时间:2008-09-18 00:44:01

标签: java c++ compiler-construction templates

我不是指编译错误,因为我犯了语法错误或其他什么。在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 个答案:

答案 0 :(得分:2)

如果不使用单独的工具,就无法在Java中基于编译时逻辑生成任何操作。从技术上讲,在Java上使用C预处理器可能,但您必须小心其对底层语言的内置假设。如果我是你,我会找到一个更好的方法来完成你正在尝试用这个编译时错误做的事情。如果有必要,你甚至可以编写自己的预处理器(可能使用APT),如果它真的是如此不可避免。

答案 1 :(得分:2)

在Java中没有办法做到这一点,与C ++中的工作方式不同。

您也许可以使用注释,并在编译之前或之后运行apt来检查注释。

例如:

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

然后编写自己的AnnotationProcessorFactory,查找@MyStaticCheck注释,并对参数执行某些操作。

注意:我没有玩过多的apt,但文档让它看起来非常可行。

答案 2 :(得分:0)

正如Matt Quail在上面回答的那样,注释和XDoclet一起适合满足您的需求。这种组合允许进行相当多的预处理,代码生成等。

答案 3 :(得分:0)

虽然问题是在前一段时间被问到的,但我决定发布我的答案,因为我解决了(在某种程度上)一个稍微类似的问题。

我的任务的具体需要两个具有不同功能集的应用程序从单个核心库构建(未使用的东西未链接)。函数集的选择由public static final boolean标志组成。问题是我想确保在每个应用程序中,它是在核心库中设置适当的标志。如果启用了不正确的函数,则应用程序不应编译,从而产生编译时错误。

我到目前为止找到的唯一解决方案是在库中声明最终变量以及标志:public static final int functionSet1 = 0;等。

在应用程序包中,我添加了一个带有检查的虚拟类

ConditionalBuild.functionSet1 = 1;

在所有的functionSetX变量中,只有一个在特定构建中成为非final。因此,只有一个应用程序可以通过构建过程而不会出现错误有没有更好的方法来实现这一目标?请在评论中告诉我。