# Definir diretiva (C/C++)

O #define cria um macro, que é a associação de um identificador ou identificador parametrizada com uma seqüência de caracteres de token.Depois que a macro estiver definida, o compilador pode substituir a seqüência de caracteres de token para cada ocorrência do identificador no arquivo de origem.

Sintaxe

#defineidentificadorseqüência de caracteres de símbolo deopt

#defineidentifier(identifieropt,...,identifieropt)token-stringopt

Comentários

O #define diretiva faz com que o compilador substituir seqüência de caracteres de símbolo de para cada ocorrência de identificador no arquivo de origem.O identificador é substituído apenas quando ele forma um token.Ou seja, identificador não é substituída se ele aparecer em um comentário em uma seqüência ou como parte de um identificador de mais tempo.Para obter mais informações, consulte Tokens de C++.

O seqüência de caracteres de símbolo de argumento consiste em uma série de símbolos, como, por exemplo, palavras-chave, constantes ou instruções completas.Um ou mais caracteres de espaço em branco necessário separar seqüência de caracteres de símbolo de de identificador.Este espaço em branco não é considerado parte de um texto substituído, nem é qualquer espaço em branco que segue o último símbolo do texto.

A #define sem um seqüência de caracteres de símbolo de remove ocorrências do identificador do arquivo de origem.O identificador permanece definido e pode ser testado usando o #if defined e #ifdef diretivas.

O segundo formulário sintaxe define uma macro do tipo função com parâmetros.Este formulário aceita uma lista opcional de parâmetros que devem aparecer entre parênteses.Depois que a macro é definida, subseqüente cada ocorrência de identificador( identificadoropt,..., identificadoropt ) é substituído por uma versão do seqüência de caracteres de símbolo argumento que tem argumentos reais substituídos por parâmetros formais.

Nomes de parâmetro formal aparecem na seqüência de caracteres de símbolo de para marcar os locais onde os valores reais são substituídos.Cada nome de parâmetro pode aparecer várias vezes em seqüência de caracteres de símbolo de, e os nomes podem aparecer em qualquer ordem.O número de argumentos na chamada deve coincidir com o número de parâmetros na definição de macro.Uso livre de parênteses garante que os argumentos reais complexos sejam interpretados corretamente.

Na lista de parâmetros formais são separados por vírgulas.Cada nome na lista deve ser exclusivo e a lista deve estar entre parênteses.Sem espaços podem separar identificador e o parêntese de abertura.Use a concatenação de linha — coloque uma barra invertida (\) imediatamente antes do caractere de nova linha — para diretivas longas em várias linhas de código-fonte.O escopo de um nome de parâmetro formal estende-se até a nova linha que termina seqüência de caracteres de símbolo de.

Quando uma macro tiver sido definida no segundo formulário de sintaxe, instâncias subseqüentes textuais, seguidas de uma lista de argumentos indicam uma chamada de macro.Os argumentos reais que segue uma instância de identificador no arquivo de origem são comparados com os parâmetros formais correspondentes na definição de macro.Cada parâmetro formal na seqüência de caracteres de símbolo que não é precedido por um stringizing (#), charizing (#@), ou colar de token (##) operador, ou não seguido por um ## operador, é substituído pelo argumento real correspondente.As macros no argumento real são expandidas antes que a diretiva substitui o parâmetro formal.(Os operadores são descritos na Pré-processador operadores.)

Os exemplos de macros com argumentos a seguir ilustram a segunda forma do #define sintaxe:

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Argumentos com efeitos colaterais, às vezes, causa macros para produzir resultados inesperados.Um determinado parâmetro formal pode aparecer mais de uma vez na seqüência de caracteres de símbolo de.Se esse parâmetro formal é substituído por uma expressão com efeitos colaterais, a expressão, com seus efeitos colaterais, pode ser avaliada mais de uma vez.(Consulte os exemplos em O operador de colagem de símbolo (#).)

O #undef diretiva faz com que a definição de um identificador pré-processador ser esquecido.Consulte A diretiva de #undef para obter mais informações.

Se o nome da macro que está sendo definido ocorre em seqüência de caracteres de símbolo de (mesmo como resultado da expansão de macro outro), ele não estiver expandido.

Uma segunda #define para uma macro com o mesmo nome gera um aviso a menos que a segunda seqüência de token é idêntica à primeira.

Específicos do Microsoft

Microsoft C/C++ permite que você redefina uma macro, se a nova definição é sintaticamente idêntica a definição original.Em outras palavras, as duas definições podem ter nomes de parâmetros diferentes.Esse comportamento difere do ANSI C, que requer que as duas definições sejam lexicalmente idênticos.

Por exemplo, as seguintes duas macros são idênticas exceto para os nomes de parâmetro.ANSIC não permite que tal uma redefinição, mas a Microsoft C/C++ o compila sem erros.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

Por outro lado, as seguintes dois macros não são idênticas e gerarão um aviso na Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

Específicos do Microsoft final

Este exemplo ilustra o #define diretiva:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

A primeira instrução define o identificador WIDTH como o 80 constante de inteiro e define LENGTH em termos de WIDTH e o inteiro 10 constante.Cada ocorrência de LENGTH é substituído pelo (WIDTH + 10).Por sua vez, cada ocorrência de WIDTH + 10 é substituído pela expressão (80 + 10).Os parênteses WIDTH + 10 são importantes porque eles controlam a interpretação em instruções de como o seguinte:

var = LENGTH * 20;

Após o pré-processamento de testar a instrução se torna:

var = ( 80 + 10 ) * 20;

que é avaliado para 1800.Sem os parênteses, o resultado é:

var = 80 + 10 * 20;

que é avaliado para 280.

Específicos do Microsoft

Definição de macros e constantes com o /D opção de compilador tem o mesmo efeito que usar um #define diretiva de pré-processamento no início do seu arquivo.Até 30 macros podem ser definidas usando a opção /D.

Específicos do Microsoft final

Consulte também

Referência

Diretivas de pré-processador