문제

구문 실수 등으로 인해 컴파일 오류가 발생했다는 의미는 아닙니다.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;
}

그런 다음 @MyStaticCheck 주석을 찾고 인수로 작업을 수행하는 자신만의 AnnotationProcessorFactory를 작성합니다.

메모:나는 apt를 많이 사용해본 적이 없지만 문서를 보면 이것이 매우 가능한 것처럼 보입니다.

다른 팁

별도의 도구를 사용하지 않고는 Java의 컴파일 타임 로직을 기반으로 작업을 생성할 수 있는 방법이 없습니다.기술적으로는 가능한 Java에서 C 전처리기를 사용하려면 기본 언어에 대한 기본 제공 가정에 주의해야 합니다.내가 당신이라면, 이 컴파일 타임 오류로 당신이 하려는 일이 무엇이든 성취할 수 있는 더 나은 방법을 찾을 것입니다.필요하다면 자신만의 전처리기를 작성할 수도 있습니다(아마도 다음을 사용하여). 적절한) 정말 불가피한 경우입니다.

Matt Quail이 위에서 답변했듯이 주석은 XDoclet, 귀하의 요구 사항을 해결하는 데 적합합니다.이러한 조합을 통해 상당한 전처리, 코드 생성 등이 가능해졌습니다.

얼마 전에 질문이 제기되었지만 약간 비슷한 문제를 (어느 정도) 해결했기 때문에 답변을 게시하기로 결정했습니다.

내 작업의 구체적인 내용은 단일 코어 라이브러리에서 구축되도록 서로 다른 기능 세트를 가진 두 개의 애플리케이션이 필요합니다(사용하지 않는 항목은 연결되지 않음).기능 세트의 선택은 다음과 같습니다. public static final boolean 플래그.문제는 각 애플리케이션이 핵심 라이브러리에 설정된 적절한 플래그로 빌드되었는지 확인하고 싶다는 것입니다.그리고 부적절한 기능이 활성화된 경우 애플리케이션은 컴파일 시간 오류를 발생시키며 컴파일되어서는 안 됩니다.

지금까지 내가 찾은 유일한 해결책은 플래그와 함께 라이브러리 최종 변수를 선언하는 것입니다. public static final int functionSet1 = 0;, 등.

애플리케이션 패키지에서 검진과 함께 더미 클래스를 추가했습니다.

ConditionalBuild.functionSet1 = 1;

모든 functionSetX 변수 중에서 특정 빌드에서는 하나만 최종이 아닌 변수로 만들어졌습니다.따라서 하나의 애플리케이션만 오류 없이 빌드 프로세스를 통과할 수 있습니다.이를 달성하는 더 좋은 방법이 있습니까?댓글로 알려주세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top