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;
}

然后编写自己的 AnnotationProcessorFactory 来查找 @MyStaticCheck 注释,并对参数进行处理。

注意:我没有玩太多 apt,但是文档使它看起来非常可行。

于 2008-09-18T06:45:29.093 回答
0

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

于 2008-09-18T08:54:27.363 回答
0

虽然这个问题是前段时间提出的,但我决定发布我的答案,因为我(在一定程度上)解决了一个稍微相似的问题。

我的任务的具体要求需要从单个核心库构建两个具有不同功能集的应用程序(并且未链接的未使用的东西)。功能集的选择是通过public static final boolean标志进行的。问题是我想确保在每个应用程序中,它是使用核心库中设置的正确标志构建的。并且在启用了不正确的功能的情况下,应用程序不应该编译给出编译时错误。

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

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

ConditionalBuild.functionSet1 = 1;

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

于 2012-06-21T12:57:44.187 回答