在 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;
}
然后编写您自己的 AnnotationProcessorFactory 来查找 @MyStaticCheck 注释,并对参数执行某些操作。
笔记:我没有过多使用 apt,但文档表明这是非常可行的。
其他提示
如果不使用单独的工具,就无法在 Java 中生成基于编译时逻辑的任何操作。从技术上来说,它是 可能的 在 Java 上使用 C 预处理器,但您必须小心其关于底层语言的内置假设。如果我是您,我会找到一种更好的方法来完成您尝试处理此编译时错误的任何操作。如果有必要,您甚至可以编写自己的预处理器(可能使用 易于)如果真的那么不可避免的话。
正如马特·奎尔在上面回答的那样,注释以及 XDoclet, ,适合满足您的需求。这种组合允许进行大量的预处理、代码生成等。
虽然这个问题是前一段时间提出的,但我决定发布我的答案,因为我解决了(在某种程度上)一个稍微相似的问题。
我的任务的具体要求需要从单个核心库构建两个具有不同功能集的应用程序(并且不链接未使用的内容)。功能集的选择是由 public static final boolean
旗帜。问题是我想确保在每个应用程序中,它都是使用核心库中设置的正确标志来构建的。并且在启用了不正确的功能的情况下,应用程序不应编译并给出编译时错误。
到目前为止,我找到的唯一解决方案是在库中声明最终变量以及标志: public static final int functionSet1 = 0;
, , ETC。
在应用程序包中,我添加了一个带有检查的虚拟类
ConditionalBuild.functionSet1 = 1;
在所有 functionSetX 变量中,只有一个变量在特定构建中成为非最终变量。因此只有一个应用程序可以通过构建过程而不会出现错误。有更好的方法来实现这一目标吗?请在评论中告诉我。