A maior parte do pré-processamento é controlada por diretivas de pré-processador. As diretivas são especificadas no código-fonte criando uma linha comentada que começa com a seqüência do caractere //#
, imediatamente seguida pela diretiva. Por exemplo, //#ifdef
.
Como a linguagem XML, as diretivas de pré-processador devem ser formadas corretamente. Ou seja, devem ter uma diretiva de início e uma de fim. Por exemplo, quando um bloco inicia com uma das diretivas //#if
, ele deve ser encerrado com uma diretiva //#endif
. Os blocos podem ser aninhados, o que significa que dentro de um bloco if/elif/else/endif
pode haver qualquer número de blocos if/elif/else/endif
adicionais.
As diretivas definem ações e condições. O pré-processador decide se os comentários devem ser inseridos ou removidos no bloco de código. Os símbolos em expressões de diretiva podem ser definidos ou não definidos. Os identificadores e as variáveis, entretanto, devem sempre conter um valor que possa ser usado ou comparado durante o pré-processamento. O pré-processador oferece suporte a três tipos de variáveis: strings, inteiros e valores booleanos.
Os nomes de variáveis devem começar com caracteres/tokens que sejam os mesmos caracteres/tokens iniciais de identificadores Java válidos, mas, além disso, os caracteres consecutivos também podem ser '.' '\' e '/'. . É possível comparar tipos de variáveis diferentes usando sintaxe de comparação comum (<=, <, >=, >
e ==
). Você também pode usar operações booleanas como &&, ||, !
e ^
. As funções <nome da variável>:defined ou defined(<nome da variável>) também podem ser usadas para verificar as definições de variável. Isso não é necessário e não deve ser usado ao criar novos blocos de código mas é incorporado para importações fáceis do J2ME Polish. Para obter mais informações, consulte Comparando variáveis do pré-processador.
O exemplo a seguir mostra o bloco If/Else
com uma diretiva elif
aninhada.
//#if mmedia //#if nokia //#if s60_ver=="1.0" import com.nokia.mmapi.v1 //#elif s60_ver=="2.0" import com.nokia.mmapi.v2 //#else import com.nokia.mmapi.def //#endif //#else import javax.microedition.mmapi //#endif //#endif
Consulte a tabela a seguir para obter uma descrição das diretivas do pré-processador.
Diretiva |
Descrição |
#ifdef [identificador] |
O identificador representa uma variável de qualquer tipo (booleano, string ou inteiro) e verifica se a variável está definida. Se for verdadeiro (se a variável estiver definida), o código a seguir é processado. Os blocos aninhados também são processados. Se for falso (a variável não está definida), o código a seguir é comentado e os blocos aninhados não são avaliados. A diretiva deve ser encerrada com #endif . |
#ifndef [identificador] |
Funciona da mesma maneira que ifdef, mas retorna "True"
se a variável não estiver definida. A diretiva deve ser encerrada com #endif . |
#elifdef [identificador] |
Funciona como uma instrução else if padrão, mas verifica automaticamente se o identificador está definido. A diretiva só pode complementar blocos internos iniciados por ifdef/ifndef . |
#elifndef [identificador] |
Funciona como uma instrução else if padrão, mas verifica automaticamente se o identificador não está definido. A diretiva só pode complementar blocos internos iniciados por ifdef/ifndef. |
#if [expressão] |
Avalia uma expressão passada e dispara a ação apropriada. A diretiva deve ser encerrada com endif . |
#elif [expressão] |
Funciona como uma instrução else if padrão e pode complementar somente os blocos iniciados por uma instrução an if . A diretiva pré-processa o código a seguir com base no resultado da expressão. |
#else |
Funciona como uma instrução else padrão. Somente pré-processa o código a seguir quando nenhuma das condições anteriores no bloco de definição for verdadeira. Complementa qualquer bloco interno iniciado com a diretiva if/ifdef/ifndef . |
#endif |
Esta diretiva deve ser usada para encerrar qualquer bloco iniciado com if/ifdef/ifndef . |
#condition [expressão] |
Deve estar na primeira linha de uma fila. Esta diretiva determina se o arquivo deve ser incluído na compilação com base no resultado da expressão. |
#debug [nível] |
Determina se a linha após a diretiva deve ter comentários inseridos ou removidos com base no nível de depuração definido na página de compilação das propriedades do projeto. Se o nível de depuração for omitido e não for definido como "Desligado" nas propriedades do projeto, o pré-processador irá automaticamente depurar a linha em questão. Utilizada com fins de depuração em expressões como System.out.println , por exemplo. Esta diretiva pode ser aninhada. |
#mdebug [nível] |
Tem o mesmo comportamento que #debug, mas em vez de inserir ou remover comentários de um bloco inteiro de linhas após a linha fica ativa até alcançar #enddebug . Esta diretiva é utilizada com fins de depuração em expressões como System.out.println , por exemplo. Esta diretiva pode ser aninhada. Se o bloco mdebug fizer uma interseção parcial em um bloco if/ifdef/ifndef (por exemplo,
enddebug estiver fora de um bloco if encerrado no qual mdebug é chamado) o pré-processador irá gerar erros. |
#enddebug |
Deve encerrar o bloco #mdebug . |
#define [identificador] #define [identificador=valor] #define [valor do identificador] |
Adiciona habilidades ou variáveis temporárias à memória do pré-processador. Não pode ser usada em blocos aninhados. As variáveis globais definidas nas propriedades de configuração do projeto substituem essas variáveis temporárias. |
#undefine [identificador] | Remove as habilidades/variáveis temporárias da memória. Esta declaração também pode ser usada para remover variáveis globais definidas nas propriedades de configuração do projeto da memória do pré-processador, mas não removerá as variáveis da lista de variáveis de configuração ou do projeto. |