Sunteți pe pagina 1din 4

Protheus : Diretivas do Pr-Processador, Constantes

Simblicas e outros Bichos


Pr-Processador:
O protheus, bem como todos os compiladores derivados do CA-Clipper, possuem um recurso
chamado de "Pr-Processador" (Outros compiladores tambm possuem como C, C++,
Assembler, etc).
o "pr-processador" quem prepara o cdigo fonte para a compilao. Ele tem a finalidade de
efetuar busca e substituio das "diretivas de pr-processamento" de forma a evitar erros durante
a compilao e ou execuo do cdigo.
Podemos elencar os seguintes recursos de "pr-processamento":

- Constantes Simblicas
- Arquivos include
- Macros do compilador
- Compilao condicional
- Comandos Definidos pelo Usurio

Constantes Simblicas:
As constantes simblicas so definidas com a diretiva do "pr-processador" #DEFINE. O "prprocessador" procura todas as constantes simblicas definidas por essa diretiva substituindo-as
pelo seu real valor.
Por exemplo:

#DEFINE
#DEFINE
#DEFINE
#DEFINE

FO_READ
FO_WRITE
FO_READWRITE
FO_SHARED

0
1
2
64

//Open for reading (default)


//Open for writing
//Open for reading or writing
//Allow others to read or write

nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_SHARED)


IF FERROR() != 0
ConOut( "Cannot open file, DOS error " , FERROR() )
ENDIF

O "pr-processador" ir traduzir para

[linha
[linha
[linha
[linha

em
em
em
em

branco]
branco]
branco]
branco]

nHandle := FOPEN("Temp.txt", 2 + 64 )
IF FERROR() != 0
ConOut( "Cannot open file, DOS error " , FERROR() )
ENDIF

O "pr-processador", no arquivo de sada, remove a diretiva #DEFINE deixando linhas em branco


para preservar a numerao das linhas e substitui os nomes das constantes pelos seus valores.

A diretiva #DEFINE, para o pr-processador, sensivel ao contexto. Ento devemos us-las da


forma que foram declaradas, se tentarmos usa-la como:
nHandle := FOPEN("Temp.txt", fo_readwrite + fo_shared)
O "pr-processador no ir subsituir as constantes pelos seus reais valores e obteremos um erro
em tempo de execuo. O sistema tentar interpretar fo_readwrite e fo_shared como variveis e
gerar uma exceo.
Ento, vale salientar, que a traduo de #DEFINE feita pelo "pr-processador" sensivel a letras
maisculas e minsculas.
Arquivos Include:
A grande maioria das diretivas de "pr-processamento" do protheus so definidas em arquivos
de cabealho, que normalmente possuem a extenso .CH (Clipper Header) Para fazer uso delas
faz-se necessrio usar a diretiva #INCLUDE. Ento, para que o pr-processador possa buscar e
substituir o valor real para a constante FO_READWRITE devemos incluir o arquivo de
cabealho "FILEIO.CH" no inicio do programa como:
#INCLUDE "FILEIO.CH"
e, durante o "pr-processamento" todas as referencias a FO_READWRITE sero substituidas
pelo seu valor real que no arquivo "FILEIO.CH" est definido como 2. Os arquivos de cabealho
so muito usados para padronizar os valores das constantes simblicas, macros do compilador
e comandos definidos pelo usurio.
Macros do Compilador:
As "macros do compilador" podero ser usadas para simular o uso de "funes in line" no
protheus. Use-as quando necessitar repetir uma pequena sequencia de codificao vrias vezes
mas que tornaria o processo custoso se uma funo real fosse utilizada. Por Exemplo: Para que
criar a funo Max( nVal1 , nVal2 ) ou Min( nVal1 , nVal2 ) se podemos criar uma macro para
esse fim:
Ex.:

#DEFINE Max( a , b ) IIF( a > b , a , b )


#DEFINE Min( a , b ) IIF( a < b , a , b )
E usa-las como:
nMax := Max( 1 , 2 )
nMin := Min( 1 , 2 )
que o "pr-processador" substituir por:
nMax := IIF( 1 > 2 , 1 , 2 )
nMin := IIF( 1 < 2 , 1 , 2 )
A vantagem de usar as macros do compilador que elas no precisam ser empilhadas, no
precisa passar pelo complexo processo que as funes passam. A desvantagem de usar as
macros do compilador para simular "funes inline" no protheus, que a diretiva #DEFINE
sensvel a maisculas e minsculas. Ento, para evitarmos erro durante a execuo, teriamos
que prever todas as possibilidades para a macro como em:
#DEFINE
#DEFINE
#DEFINE
#DEFINE

Max(
MAx(
MAX(
mAX(

a
a
a
a

,
,
,
,

b
b
b
b

)
)
)
)

IIF(
IIF(
IIF(
IIF(

a
a
a
a

>
>
>
>

b
b
b
b

,
,
,
,

a
a
a
a

,
,
,
,

b
b
b
b

)
)
)
)

#DEFINE
#DEFINE
#DEFINE
#DEFINE
...

maX(
max(
MaX(
mAx(

a
a
a
a

,
,
,
,

b
b
b
b

)
)
)
)

IIF(
IIF(
IIF(
IIF(

a
a
a
a

>
>
>
>

b
b
b
b

,
,
,
,

a
a
a
a

,
,
,
,

b
b
b
b

)
)
)
)

#DEFINE Min( a , b ) IIF( a > b , a , b )


#DEFINE MIn( a , b ) IIF( a > b , a , b )
#DEFINE MIN( a , b ) IIF( a > b , a , b )
#DEFINE mIN( a , b ) IIF( a > b , a , b )
#DEFINE miN( a , b ) IIF( a > b , a , b )
#DEFINE min( a , b ) IIF( a > b , a , b )
#DEFINE MiN( a , b ) IIF( a > b , a , b )
#DEFINE mIn( a , b ) IIF( a > b , a , b )
...
Isso seria muito trabalhoso, ento, podemos abrir mo de outra diretiva do pr-processador para
simular funes "in line", a diretiva #TRANSLATE ou #XTRANSLATE como:
#TRANSLATE Max( <a> , <b> ) => IIF( <a> \> <b> , <a> , <b> )
#XTRANSLATE Min( <a> , <b> ) => IIF( <a> \< <b> , <a> , <b> )
E poderemos chama-la de qualquer forma, ex:
nMax
nMax
nMax
nMax
ou

:=
:=
:=
:=

Max(
MAx(
MAX(
mAX(

1 , 2 )
4 , 3 )
10 , 20 )
45 , 3 )

nMin := Min( 1 , 2 )
nMin := MIn( 15 , 12 )
nMin := MIN( 1970 , 10 )
nMin := mIN( 3 , 1 )
que sero traduzidas corretamente pelo pr-processador para
nMax
nMax
nMax
nMax

:=
:=
:=
:=

IIF(
IIF(
IIF(
IIF(

1 > 2 , 1 , 2 )
4 > 3 , 4 , 3 )
10 > 20 , 10 , 20 )
45 > 3 , 45 , 3 )

:=
:=
:=
:=

IIF(
IIF(
IIF(
IIF(

1 < 2 , 1 , 2)
15 < 12 , 15 , 12 )
1970 < 10 , 1970 , 10 )
3 < 1 , 3 , 1 )

ou
nMin
nMin
nMin
nMin

Compilao condicional:
O pr-processador trata a compilao condicional incluindo ou excluindo partes do cdigo para
a real compilao de acordo com uma condio. As diretivas para a compilao condicional so:
#IFDEF - Verifica se um smbolo est definido
#IFNDEF - Verifica se um smbolo no est definido
#ELSE - Incluir algo se um #IFDEF ou #IFNDEF "falhar"
#ENDIF - Indica o final da codificao controlada pelas diretivas
#IFDEF, #IFNDEF e #ELSE.

Podemos definir um smbolo sem abrituir um valor a ele. Podemos escrever #DEFINE DEBUG e
test-lo em seguida:
#IFDEF DEBUG
ConOut( "Estou em processo de depurao" )
#ENDIF
Podemos definir simbolos, tambm, partir da IDE do Protheus, nos parmtros para compilao
passando-os da seguinte forma D/DEBUG cria o smbolo DEBUG que poder ser verficado da
mesma forma (um exemplo poder ser obtido em: "Protheus IDE:: Compilao Condicional", ou
ainda em "Sudoku :: Tutorial"). Existem vrios simbolos condicionais definidos no protheus, o
principal e mais usado o TOP, para verificar se o RPO a ser utilizado TOPCONNECT ou no.
#IFDEF TOP
cQuery := "SELECT * FROM " + RetSqlName( "SA1" )
#ENDIF
Essa parte do cdigo s ser incluida na verso definitiva do cdigo a ser compilado se o
smbolo TOP estiver definido.
Vou deixar os comandos definidos pelo usurio para os prximos "posts".

Read more: http://www.blacktdn.com.br/2010/09/protheus-diretivas-do-preprocessador.html#ixzz3e5Gvz3SV

S-ar putea să vă placă și