Substituição de macro:
Defina o nome da macro:
#define a memória onde o nome da macro será substituído
Use o nome da macro:
printf("%d\n", nome da macro);
Observação: no estágio de pré-processamento, o pré-processador substituirá o nome da macro usado pelo código pelo conteúdo após o nome da macro.
Constantes de macro:
#define dados literais do nome da macro
Use um nome significativo para substituir os dados de valor literal sem sentido, o que pode melhorar a legibilidade e a escalabilidade do código.
Expressão macro:
#define expressões de nomes de macro, operações, identificadores mais complexos
#define STU_FORMAT "%s %c %hd %d"
#define sf scanf
#define YEAR_SEC (3600*24*365ul)
Macros pré-definidas:
Macros predefinidas do compilador:
__FILE__ Obtém o nome do arquivo atual
__func__ Obtém o nome da função atual
__LINE__ Obtém o número da linha atual
__DATE__ obtém a data atual
__TIME__ Obtém a hora atual
__WORDSIZE Obtém o número de bits do compilador atual
Adequado para exibir mensagens de aviso e erro.
Macros predefinidas da biblioteca padrão:
Os valores máximos e mínimos de todos os tipos inteiros definidos no arquivo de cabeçalho limits.h
#define SCHAR_MIN (-128)
#define SCHAR_MAX 127
#define UCHAR_MAX 255
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 65535
#define INT_MIN (-INT_MAX - 1)
#define INT_MAX 2147483647
#define UINT_MAX 4294967295U
#define LLONG_MAX 9223372036854775807LL
#define LLONG_MIN (-LLONG_MAX - 1LL)
#define ULLONG_MAX 18446744073709551615ULL
Função macro:
#define 宏名(a,b,c,...) a+b*c
Uma função de macro não é uma função real, mas uma macro com parâmetros, usada apenas como uma função.
Ao usar uma função de macro no código, haverá duas substituições durante o pré-processamento. Na primeira vez, a função de macro é substituída por uma sequência de códigos e expressões por trás dela e, na segunda vez, os parâmetros da função de macro são substituídos na expressão .
Se o código por trás da função de macro tiver várias linhas, você poderá usar chaves para protegê-lo.
#define nome da macro(a,b,c,...) {código 1; código 2; ...}
O código por trás da função de macro não pode ser agrupado diretamente. Se o código for muito longo, você pode usar o caractere de continuação para quebrar a linha.
#define nome da macro(a,b,c,...) { \
código 1; \
código 2; \
... \
}
#define trocar(a,b) { \
char tmp[tamanho(a)]; \
memcpy(tmp,&a,sizeof(a)); \
memcpy(&a,&b,sizeof(a)); \
memcpy(&b,tmp,sizeof(a)); \
}
Vantagens e desvantagens de funções comuns e funções macro?
Vantagens das funções de macro:
1. A velocidade de execução é rápida, não é uma chamada de função real, mas uma substituição de código, e não experimentará parâmetros de valor, saltos,
valor de retorno.
2. O tipo de parâmetro não será verificado, por isso é altamente versátil.
Desvantagens das funções de macro:
1. Por não ser uma chamada de função real, mas uma substituição de código, toda vez que for usada, uma cópia do código será substituída, o que causará redundância de código, baixa velocidade de compilação e grande arquivo executável.
2. Não há valor de retorno e pode haver no máximo um resultado de execução.
3. A verificação de tipo não é rigorosa e a segurança é baixa.
4. Chamadas recursivas não podem ser feitas.
Vantagens das funções:
1. No caso de não haver armazenamento redundante, o código da função será armazenado apenas no segmento de código, quando usado, ele irá pular para o passado para execução, retornar após a execução, podendo também ser adicionado valor de retorno.
2. Alta segurança, verificação de tipo será executada nos parâmetros.
3. Chamadas recursivas podem ser feitas para implementar o algoritmo de divisão e conquista.
Desvantagens das funções:
1. Em comparação com a função macro, sua velocidade de execução é mais lenta, ao chamar, passará pelo processo de passagem de parâmetros, salto, retorno, etc.
2. Tipo específico, que tipo de parâmetro formal e que tipo de parâmetro real deve ser, que não pode ser usado universalmente.
Que tipo de código é adequado para encapsulamento em uma função de macro?
1. A quantidade de código é pequena, mesmo que seja usada várias vezes, não causará redundância excessiva no segmento de código.
2. O número de chamadas é alto, mas o número de execuções é alto.
3. Não há exigência de valor de retorno.
Pontos a ter em mente ao criar macros:
1. Não adicione um ponto e vírgula no final.
2. Adicione parênteses para evitar ambigüidade.
3. Não use variáveis de auto-incremento e auto-decremento para fornecer parâmetros para funções de macro.