Pergunta

Eu não quero dizer os erros de compilação porque eu cometi um erro de sintaxe ou o que quer. Em C ++ podemos criar erros em tempo de compilação com base nas condições como no exemplo a seguir:

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

No VS 2005 esta saída vontade:

------ 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 ==========

Existe alguma maneira de conseguir isso em Java?

Foi útil?

Solução

Não há nenhuma maneira de fazer isso em Java, não da mesma forma como ele funciona para você em C ++.

Você poderia talvez usar anotações e executar apt antes ou após a compilação para verificar as suas anotações.

Por exemplo:

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

E, em seguida, escrever o seu próprio AnnotationProcessorFactory que olhou para as anotações @MyStaticCheck, e faz algo com os argumentos.

Nota:. Eu não tenho jogado muito com apt, mas a documentação faz parecer como este é muito capaz de fazer

Outras dicas

Não há nenhuma maneira de produzir quaisquer ações baseadas na lógica de tempo de compilação em Java sem o uso de uma ferramenta separada. Tecnicamente, é possível usar o pré-processador C em Java, mas você teria que ter cuidado com a sua built-in suposições sobre a linguagem subjacente. Se eu fosse você, eu iria encontrar uma maneira melhor de fazer seja o que for que você está tentando fazer com este erro em tempo de compilação. Se necessário, você pode até escrever o seu próprio pré-processador (possivelmente usando APT ) se ele é realmente tão inevitável.

Como Matt Quail respondida acima, anotações, juntamente com XDoclet , são adequados para atender às suas necessidades. Que as combinações permite uma um pouco de pré-processamento, geração de código, etc.

Embora a pergunta foi feita há algum tempo atrás, eu decidi postar minha resposta, porque eu resolvido (até certo ponto) um problema um pouco semelhante.

O específico da minha tarefa requer duas aplicações com um conjunto diferente função a ser construídos a partir de uma única biblioteca central (e outras coisas não utilizado não ser ligados na). A seleção de conjunto de funções é feita por bandeiras public static final boolean. O problema é que eu quero para garantir em cada uma das aplicações, que ele é construído com um conjunto bandeira própria na biblioteca central. E no caso de funções inadequadas são habilitados, o aplicativo não deve compilar dando um erro de tempo de compilação.

A única solução que eu encontrei até agora é declarar nas variáveis ??finais de biblioteca, juntamente com as bandeiras:. public static final int functionSet1 = 0;, etc

No pacote de aplicativos eu adicionei uma classe fictício com o checkup

ConditionalBuild.functionSet1 = 1;

De todas as variáveis ??functionSetX apenas um feitas non-final numa compilação específica. Assim, apenas um aplicativo pode transmitir o processo de construção sem o erro. Existe uma maneira melhor de conseguir isso? Por favor, deixe-me saber nos comentários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top