O operador ##, utilizado na definição de macros, nos possibilita a
substituição de símbolos ou tokens em declarações de código em seu corpo.
Sintaxe
#define NOME_MACRO( parametro1, parametro2 ) parametro1##parametro2
Exemplo
//main.c
#define MINHA_MACRO(parametro1,parametro2) \
int var_##parametro1=parametro2
No exemplo de uso acima, criamos uma variável int em que seu nome é composto
dos termos var_ e ##parametro1 cujos argumentos parametro1 e
parametro2 foram passados.
Exemplo 1
#include <stdio.h>
#define MINHA_MACRO(parametro1, parametro2) \
int var_##parametro1=parametro2
void main()
{
MINHA_MACRO( teste, 999);
printf("%i",var_teste);
}
Saída
999
No exemplo acima, o argumento teste foi substituído pelo operador
##parametro1, e o segundo argumento, 999, foi substituído por
parametro2 criando assim a declaração da variável abaixo:
int var_teste = 999;
É importante observar que não criamos a variável var_teste previamente, e que a
mesma foi criada como o tipo int, porém, podemos modificar a macro acima
para criar variáveis de outros tipos:
Exemplo 2
#include <stdio.h>
#define MINHA_MACRO(tipo_var , nome_var, valor_var) \
tipo_var var_##nome_var=valor_var
void main()
{
MINHA_MACRO( unsigned short,inteira, 999);
printf("%i\n",var_inteira);
MINHA_MACRO( float,decimal, 10.09);
printf("%.02f",var_decimal);
}
Saída
999
10.09
O operador ## também pode ser utilizado em conjunto com funções de forma
a criarmos uma codificação de chamada genérica baseada em um valor passado
como argumento:
Exemplo 3
#include <stdio.h>
void funcao1(void)
{
printf("funcao1\n");
}
void funcao2(void)
{
printf("funcao2\n");
}
#define EXECUTA_FUNCAO(numero_funcao)\
funcao##numero_funcao()
void main()
{
EXECUTA_FUNCAO(1);
EXECUTA_FUNCAO(2);
}
Saída
funcao1
funcao2
No exemplo acima, não podemos usar variáveis, constantes e enumeradores como valor
do argumento numero_funcao, sendo apenas valores inteiros.
O uso do ## leva em consideração a necessidade e também da criatividade
de quem está codificando, mostrando-se um recurso significativo para criação
macros mais complexas.