
Captulo 3 - diretivas de compilao
  As diretivas de compilao so comentrios com sintaxe especial que podem
ser usados em qualquer parte do programa, comeando pelo caractere  $ pre-
cedido por um delimitador de abertura, normalmente "{" e a respectiva di-
retiva. Podem vir acompanhados por especificaes mais ou menos aps a di-
retiva.

  Estas diretivas tem efeitos apenas quando da compilao do programa. 
Podem ser globais ou locais. No modo global tem efeito em todo o programa, 
no modo local, apenas em parte do mesmo, desde que este seja um programa 
ou uma unidade (Unit).

  Podemos colocar um grupo de diretivas separando-as por vrgula. 

  A seguir mostramos individualmente as possveis diretivas, comeando pe-
las diretivas por chaves, aquelas que trabalham como se fossem um interrup-
tor liga/desliga, o segundo grupo  feito por parmetros, e por fim um ter-
ceiro grupo o das diretivas condicionais
$A   alinhamento de dados
     sintaxe:   {$A+} ou {$A-}
     default:   {$A+} 
     tipo:   global
  As chaves, menos ou mais, permitem o alinhamento por byte ou por word,
para variveis ou constantes tipadas. 
  O alinhamento por word no tem efeito no processador 8088. 
  Entretanto os grupos de processadores 80x86, fazem com que a execuo 
de comandos seja mais rpida, pois esta  a maneira com que so comparados
os itens e endereos de memria.
  No estado {$A+}, todas as variveis so constantes tipadas que tem como
tamanho um nmero mpar de bytes, so "alargadas" de um byte para que o 
processador trabalhe no formato de word.
  no estado {$A-}, no existe alinhamento, o endereo de cada varivel ou 
constante tipada  colocado sequencialmente, respeitando-se apenas o pr-
prio tamanho. 

$B   avaliao booleana
     sintaxe:   {$B+} ou {$B-}
     default:   {$B-}
     tipo:   local
  A avaliao de expresses booleanas pode ter geraes de cdigos diferen-
tes para os operadores booleanos "and" e "or".
  No estado {$B+}, o compilador gera o cdigo completo para a avaliao 
da expresso booleana. Esta forma, apesar de tornar a compilao mais demo-
rada, garante que o valor da operao booleana, que contenha "and" e "or",
tenha um resultado lgico. 
  No estado {$B-}, o compilador gera um cdigo para uma curta anlise da
expresso e esta poder ter um resultado que "trave" o programa, quando do
momento da execuo, cabendo ento ao programador, o cuidado de que a ex-
presso booleana seja lgica. Em contrapartida, o processador diminui con-
sideravelmente o tempo para se determinar se uma expresso  verdadeira ou
falsa.
    As informaes para "Debug" podem estar disponveis ou no.
    Estas informaes consistem do nmero da linha para a tabela de
procedimentos, e o mapa do endereo cdigo objeto em relao ao programa fonte.
    Quando do uso da informao de "Debug", esta ir para o programa ou
unidade que estiver integrada ao "Debugger", podendo-se marcar pontos de
parada em locais estratgicos do programa, execut-lo passo a passo ou
rotina por rotina. Quanso ocorrer um erro de execuo em um progrma ou
unidade compilada, com a diretiva {$D+}, o Turbo Pascal poder localizar o
causador do erro no programa, atravs do comando ALT-C/F.
    O D/s e o O/L/M so chaves que nos permitem um completo mapa f\de informa
es do arquivo, porm s estaro disponveis se utilizada a diretiva {$D+}
     A deretiva de emulao permite habilitar ou no o uso de simulao por
softwer do co-processador aritmtico 8087 quando este no estiver presente fisicamente.
    Quando compilamos um programa utilizando as diretivas {$N+, E+} o Turbo
Pascal "linka" todo o emulador 8087. O resultado do arquivo .EXE pode ser
utilizado em equipamentos que tenham ou no o co-processador aritmtico 8087
presente. O prprio Turbo Pascal far o uso do emulador ou no, quando necessrio.
    No caso de usarmos as diretivas {$N+, E-}, o Turbo Pascal "linkar" uma
pequena rotina de pontos flutuantes, podendo apenas ser utilizada quando da
existncia do 8087.
    A emulao do 8087 no ter efeito se utilizada em uma unidade. Somente
tem efeito quando da utilizao em programas. Tambm quando do uso da
diretiva{$N-}, o emulador no ter efeito, simplesmente ser ignorado.
$F          Fora          "FAR  Calls"
            Sintaxe:             {$F+} ou {$F-}
            Default:             {$F-}
            Tipo:                Local
    Esta diretiva controla o tipo de chamada "call" das rotinas do programa,
podendo ser locais "near" ou distantes "far".
    Procedimentos e funes compiladas com a diretiva {$F+}, usam as
chamadas distantes com a diretiva {$F-}. O Turbo Pascal efetua
automaticamente a seleo mais apropriada ou a que achar mais conveniente.
    Em progrmas que se utilizam de overlays,  conveniente que se use a
diretiva {$F+}.

$G        Checagem de entrada/sada
          Sintaxe:      {$G+} ou {$G-}
          Default:      {$G-} para modo real,
                        {$G+} para modo protegido
          Tipo:         Global
    A diretiva $G permite ou no a gerao de cdigos para o processador
80286. Os programas compilados com a diretiva desativada podem ser
executados em qualquer processador da famlia 80x86, j no seu estado ativo,
o compilador usa as instrues avandas do 80286 para providenciar a gerao
de cdigos.
ATENO:
Os programas compilados com a diretiva $G+ no podem ser executados em
processadores 8088 e 8086.

    As instrues adicionais utilizadas com a diretiva ligada so:
    - ENTER
    - LEAVE
    - PUSH imediato
    - extended IMUL
    - extended SHL
    - extended SHR

$I          Checagem de entrada/sada
            Sintaxe:    {$I+} ou {$I-}
            Default:    {$I+}
            Tipo:       Local
    As diretivas de checagem de entrada e sada "I/O" podem  habilitar ou
inibir erros de execuo de um programa a cada entrada ou sada. seja qual
for o dispositivo utilizado.
    Caso a diretiva esteja habilitada {$I+} e houver um erro na rotina de
entrada ou sada, o programa ser interrompido com a respectiva mensagem de
erro. Ao contrrio, se estiver inibida {$I-}, o retorno do erro ser enviado
a uma funo chamada IOResult, e poder ser tratado logicamente pelo programador.

$K          Chamadas inteligentes (Apenas para Windows)
            Sintaxe:     {$K+} ou{$K-}
            Default:     {$K+}
            Tipo:         Global

    Esta opo permite a gerao de controles para chamadas de procedimentos
e funes que so exportadas pela aplicao.

$L      Smbolos Locais
        Sintaxe:     {$L+} ou {$L-}
        Default:     {$L+}
        Tipo:        Global
    Esta diretiva habilita ou no a gerao de informaes referntes aos
smbolos locais, que consistem em nomes e tipos de todas as variveis e
constantes do mdulo.
    A opo O/L/M e D/S somente  gerar aas informaes para smbolos
locais, se for utilizada a diretiva de compilao {$L+}.
    Caso a diretiva de debug estiver desligada {$D-}, a diretiva $L no ter efeito.

$N     Processador Numrico
       Sintaxe:   {$N+} ou {$N-}
       default:   {$N-}
       Tipo:      Global
    A diretiva de processador numrico permite dois modos diferentes de
gerao de cdigo de ponto flutuante de suporte para Turbo Paascal, quando
da utilizao de tipos prprios tais como: single, double, extended, comp.
    Na opo {$N-}, o Turbo se utiliza de software em substituio ao
co-processador fsico quando da execuo do progama. Na opo {$N+}, 
utilizado o co-processador aritmtico 8087.
$O     Gerao de cdigo de Overlay.
       Sintaxe:    {$O+} ou {$O-}
       Default:    {$O-}
       Tipo:       Global
    Esta diretiva, $O, habilita ou no a gerao do cdigo de overlay.
    As unidades,unit, no Turbo Pascal, s podero ser utilizadas em overlay
quando esta diretiva estiver ligada, {$O+}.

$P     Abertura de Strings
       Sintaxe:      {$P+} ou {$P-}
       Default:      {$P-}
       Tipo:         Global
    Controla o sentido das variveis do tipo strings declaradas como
parmetros e utilizadas como palavras-chave. 
    Quando esta varivel est desativada os parmetros do tipo string so
normais, j quando est ativa os parmetros so abertos como strings,
podendo assim identificar de qualquer forma para a declarao.

#Q    Checagem de "Overflow"  (estouro)
      Sintaxe:     {$Q+} ou {$Q-}
      Default:     {$Q-}
      Tipo:        Local
    Controla a gerao do cdigo de checagem de estouro. 
     Estando ativa, esta diretiva checar as operaes de inteiros +, -< *
Abs, Sqr, Succ, e Pred para verificar se no houve estouro.
    O cdigo para estas opraes  adicionado e verifica-se se o resultado
est dentro da faixa suportada. No caso de estour o programa ser terminado
com uma mensagem de erro de execuo. Esta diretiva dever ser utilizada em
conjunto com a diretiva $R.
ATENO
    Esta diretiva dever ser utilizada apenas para operao de "debugging",
pois a mesma quando ativa,deixa o programa mais lento e maior.
$R   checagem de "range" (faixa)
     sintaxe: {$R+} ou {$R-}
     default: {$R-}
     tipo: local
  Quando a utilizao da diretiva {$R+}, todas as tabelas strings indexa-
das sero verificadas em toda sua faixa de ndice, assim como tambm as 
variveis escalares. Esta diretiva faz com que o prograjma fique mais lon-
]go e mais lento, porm os possveis erros tero a sua mensagem correspon-
dente.
$S   checagem do estouro do "Stack" (pilha)
     sintaxe: {$S+} ou {$S-}
     default: {$S+}
     tipo: local
  Esta diretiva permite ou no a gerao de cdigo de estouro de Stack. 
Quando est ligada {$S+}, o compilador gerar cdigo no comeo de um pro-
cedimento ou funo e verificar se h espao suficiente para as variveis
e outras temporrias. No caso de no haver espao suficiente, o programa 
ser interrompido com o cdigo de erro correspondente. Se esta diretiva 
estiver desligada e no existir espao suficiente no Stack, poder causar
dano ao sistema.
$T   checagem ponteiros tipados
     sintaxe: {$T+} ou {$T-}
     default: {$T-}
     tipo: local
  Esta diretiva controla os tipos dos ponteiros gerados elo operador "@".
Estando desativada, o resultado de um tipo ponteiro ser sempre no tipado,
no entanto se estiver ativa, o operador "@" do ponteiro ter tipo idntico
ao da varivel que estiver a ele associada. 
$V   checagem de string
     sintaxe: {$V+} ou {$V-}
     default: {$V+}
     tipo: local
  A checagem de variveis do tipo string,  utilizada quando estas so usa-
das como parmetros.
  No estado {$V+},  requerido que os tipos sejam exatamente iguais, tanto
o parmetro como a varivel local. J no estado {$V-}, o parmetro passado
pode ter qualquer tamanho menor ou igual a local.
$W   windows stack frame (apenas para windows)
     sintaxe: {$W+} ou {$W-}
     default: {$W+}
     tipo: local
  Permite a gerao de um cdigo de incio e fim para procedimentos, quando
ativa, o compilador gera uma entrada e uma sada especial para chamadas 
distantes e habilita o uso em modo real para o gerenciamento de memria, 
ajustando as rotinas chamadas em sua rea de cdigo e segmento. 
$X   checagem da sintaxe estendida
     sintaxe: {$X+} ou {$X-}
     default: {$X-}
    tipo: global
  No estado {$X-}, a sintaxe estendida e desabilitada, poder causar um erro
se, por exemplo uma funo for chamada sem ter seu resultado atribuido 
a uma varivel, j no estado {$X+}, alm de no ocorrer erro, o resultado 
da funo poder ser descartado.  
$Y   informao da referncia simblica
     sintaxe: {$Y+} ou {$Y-}
     default: {$Y+}
     tipo: global
  Esta diretiva habilita ou no a gerao de informao sobre a referncia 
simblica, ou seja, uma tabela que contm o nmero de todas as declaraes
para os smbolos no mdulo. Esta informao  para ser utilizada pelo Ob-
jectBrowser.
  O segundo grupo de diretivas  o de parmetros como realacionamos a se-
guir
$C   atributo do segmento de cdigo (windows e modo protegido)
     sintaxe: {$ Atributo Atributo}
     default: {$C MOVEABLE DEMANDLOAD DISCARDABLE}
     tipo: global
  Controla os atributos do segmento de cdigo. Esta diretiva apenas afeta
 segmento de cdigo dentro mdulo (Unit, Programa ou Biblioteca) que for
carregado na memria. Os segmentos de cdigo ocorrem em grupos de dois.
Os atributos possveis so: 
MOVEABLE: o sistema poder trocar uma locao de cdigo na memria. 
FIXED: o sistema no poder trocar a locao de cdigo na memria.
PRELOAD: o segmento de cdigo quando o programa  inicializado.
DEMANDLOAD: o segmento de cdigo  carregado apenas quando necessrio.
PERMANENT: o segmento de cdigo permanece na memria a partir da primeira 
vez que  carregado.
DISCARDABLE: o segmento de cdigo poder ser removido, caso no esteja sendo
utilizado.
$D   descrio (windows e modo protegido)
     sintaxe: {$D texto}
     tipo: global
  Insere uma entrada de um texto especfico dentro do mdulo de descrio
no cabeario de um arquivo .EXE OU .DLL. 
$G   segmento de grupo de units (windows e modo protegido)
     sintaxe: {$G unit, unit,...}
     tipo: local
  Esta diretiva permite especificar o grupo de units a ser ligado em um 
mesmo segmento. 
$I   incluso de arquivos 
     sintaxe: {$I nomearq}
     tipo: local
  Diretiva de incluso, {$I nomearq} permite que seja includo no programa,
quando da compilao, o arquivo especificado emnomearq.  uma soluo 
quando o programa tem tamanho que excede a memria de edio. Caso no seja
especificada extenso no nome do arquivo, esta ser assumida como .PAS.
  Podemos usar esta diretiva em at 15 nveis.
$l   linkagem de objetos
     sintaxe: {$L nomearq}
     tipo: local
  A diretiva {$L nomearq}, permite que o objeto de nomearq seja "linkado"
quando da compilao de um programa ou unidade. Quando usada para "linkar"
programas escritos em linguagem assembly, dever ser utilizada a declarao
External.
  Quando no utilizarmos a extenso, ser assumida como .OBJ.
$M   alocao do tamanho da memria
     sintaxe: {$M EspacodoStack, HeapMin, HeapMax}
     default: {$M 16384, 0, 655360}
     tipo: local
  Esta diretiva permite que se escolha o espao disponvel para o Stack 
e o Heap. No estado default, temos 16 KBytes para o stack, memria mnima
para o Heap  o de 0 KBytes e o mximo de 640 KBytes. 
  O espao para o stack pode variar entre 1024 a 65520, de preferncia 
mltiplo de 1024 (1 KByte), o Heap mnimo pode variar entre 0 e 655360, 
e o Heap mximo entre o Heap mnimo e 655360. 
  No tem efeito quando usados em unidades (Units). 
$O   carga de unit em overlay
     sintaxe: {$O nomeunit}
     tipo: local 
  A diretiva $O  utilizada para carga de uma unidade, e tem efeito quando 
da compilao de uma unidade como .OVR de um arquivo .EXE.

$R Carga de Resource. (Windows e modo protegido)
      Sintaxe:  {$R nomeresource}
      Tipo:   Local
   Esta diretiva permite especificar o nome de um arquivo resource para ser    
includo em uma aplicao ou biblioteca. Sua extenso default .RES.

$S  Preferncia de Tamanho de Segmento. (Windows e modo protegido)
    Sintaxe:   {$S tamanho}
    Default:   {$S  l6384}
    Tipo:       Global
  Esta diretiva apenas  vlida para uma biblioteca ou para o programa
principal, e permite especificar o tamanho do segmento de cdigo.

  O ltimo grupo so as diretivas de compilao condicionais, que so 
baseadas na avaliao dos smbolos condicionais.

$DEFINE    Define um nome.
    sintaxe:  {DEFINE Nome}
  Esta diretiva permite que se definna um smbolo condicional associado
a um nome.

$ELSE  Compila ou ignora o fonte aps ele.
       Sintaxe:    {$ELSE}
   Quando utilizamos uma diretiva do tipo $FDEF ou $IFNDEF e um $ENDIF, a
utilizo do $ELSE permite que compilemos a parte do programa fonte que es-
tiver aps esta diretiva, quando a condio anterior no for satisfeita.

$ENDIF     Conclui  uma diretiva do tipo $IFxxxx.
           Sintaxe:     {$ENDIF}

$
