O operador ##, utilizado na definição de macros, nos possibilita a substituição de símbolos ou tokens
em declarações 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 do termo var_ e
##parametro1 cujos argumentos parametro1 e parametro2 são passados como argumento.
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 observarmos 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, baseado 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.