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

在Java中产生条件编译时错误,java,c++,compiler-construction,templates,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_#

我不是说编译错误,因为我犯了语法错误或其他什么。在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;
}
模板结构编译器错误;
模板结构编译器错误{};
#定义静态检查(expr,msg){CompileTimeError ERROR_##msg;(void)ERROR_##msg;}
int main(int argc,char*argv[])
{
静态检查(错误,编译时失败);
返回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 ==========
----构建已启动:项目:测试,配置:调试Win32------
编译。。。
Test.cpp
f:\temp\test\test\test.cpp(17):错误C2079:“错误\u编译\u时间\u失败”使用未定义的结构“CompileTimeError”
具有
[
__形式=0
]
生成日志保存在“file://f:\temp\Test\Test\Debug\BuildLog.htm”中
测试-1个错误,0个警告
======生成:0成功,1失败,0最新,0跳过==========

有没有办法在Java中实现这一点?

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

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

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

例如:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}
然后编写自己的AnnotationProcessorFactory来查找@MyStaticCheck注释,并对参数进行处理


注:我没有用APT玩太多,但是文档看起来很有能力。

< P>在java中没有办法,C++中没有用它的方式。

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

例如:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}
然后编写自己的AnnotationProcessorFactory来查找@MyStaticCheck注释,并对参数进行处理


注意:我对apt的使用不太多,但文档说明这看起来非常实用。

正如马特·奎尔(Matt Quail)在上面回答的那样,注释和注释适合满足您的需要。这种组合允许进行相当多的预处理、代码生成等。

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

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

我的任务的特殊性要求从一个核心库构建两个具有不同功能集的应用程序(并且不链接未使用的内容)。通过
公共静态最终布尔值
标志选择函数集。问题是,我想确保在每个应用程序中,它都是使用核心库中设置的适当标志构建的。如果启用了不正确的函数,则应用程序不应编译,因为会出现编译时错误

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

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

ConditionalBuild.functionSet1 = 1;

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

虽然这个问题是不久前提出的,但我还是决定发布我的答案,因为我(在一定程度上)解决了一个稍微类似的问题

我的任务的特殊性要求从一个核心库构建两个具有不同功能集的应用程序(并且不链接未使用的内容)。通过
公共静态最终布尔值
标志选择函数集。问题是,我想确保在每个应用程序中,它都是使用核心库中设置的适当标志构建的。如果启用了不正确的函数,则应用程序不应编译,因为会出现编译时错误

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

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

ConditionalBuild.functionSet1 = 1;
在所有functionSetX变量中,只有一个在特定构建中成为非最终变量。因此,只有一个应用程序可以在没有错误的情况下通过构建过程。有没有更好的方法来实现这一点?请让我在评论中知道