#define
#define <identificador> [<texto de substituição>]Define identificadores, constantes manifestas ou pseudofunções substituídas pelo pré-processador.
Visão geral
#define associa um identificador sensível a maiúsculas e minúsculas a um texto de substituição. A expansão ocorre durante o pré-processamento, antes da compilação, e não cria uma variável em tempo de execução. Também pode definir um símbolo sem valor para controlar #ifdef e #ifndef.
Sintaxe
#define <identificador> [<texto de substituição>]Constantes manifestas
#define MAX_PRODUTOS 150
#define MSG_ERRO "Operação inválida para este usuário."
User Function ExDefine()
Local nQuantidade := 151
If nQuantidade > MAX_PRODUTOS
MsgStop(MSG_ERRO, "Validação")
EndIf
ReturnOs identificadores são substituídos antes da compilação; não ocupam memória como variáveis de execução.
Pseudofunção
#define AREA(nBase, nAltura) (nBase * nAltura)
User Function ExArea()
Local nResultado := AREA(10, 12)
ConOut(CValToChar(nResultado))
ReturnO pré-processador expande AREA(10, 12) para a expressão correspondente.
- Use nomes em maiúsculas por convenção.
- #define pode criar uma constante manifesta, um símbolo de controle ou uma pseudofunção com argumentos.
- Envolva a expressão de uma pseudofunção entre parênteses para preservar a precedência.
- A definição vale a partir da linha onde aparece e, em regra, dentro da unidade fonte após a expansão dos includes.
- A substituição é textual: argumentos com efeitos colaterais podem ser avaliados mais de uma vez em pseudofunções mal construídas.
- Não use #define para esconder lógica complexa; prefira uma função real quando depuração, validação ou tipo forem importantes.
- Identificadores definidos são sensíveis a maiúsculas e minúsculas.
