(@Dayvison_ postou uma excelente explicaзгo enquanto eu estava digitando esta, mas pra nгo jogar meus minutinhos no lixo eu vou postar mesmo assim)
O primeiro passo й saber pra que isso funciona. Vocк jб deve saber, mas vou explicar caso alguйm se interesse no assunto e nгo fique boiando totalmente.
O cуdigo que vamos explorar serve pra redefinir um macro de acordo com a estrutura utilizada, й como fazer "function overload", sу que com macros.
O segundo passo й entender a estrutura de busca dos macros pra entender o que estб acontecendo. Sгo definidas da seguinte forma:
PHP код:
#define <parte 1><parte 2><parte 3>
- parte 1: O nome do macro, deve iniciar com um caractere vбlido.
- parte 3: O caractere final (vбlido ou invбlido).
- parte 2: Tudo entre a parte 1 e a parte 3. Deve iniciar com um caractere invбlido para separar-se do nome do macro. Aqui й onde vocк coloca os parвmetros e tal.
Entгo vamos analisar os macros:
PHP код:
#define m@3:@MACRO1$%0$
parte 1: m@3
parte 2: :@MACRO1$%0
parte 3: $
PHP код:
#define m@2:m@3:@MACRO1<%0>
parte 1: m@2
parte 2: :m@3:@MACRO1<%0
parte 3: >
PHP код:
#define m@1:m@2:m@3:@MACRO1<%0>[%1]
parte 1: m@1
parte 2: :m@2:m@3:@MACRO1<%0>[%1
parte 3: ]
PHP код:
#define MACRO1 m@1:m@2:m@3:@MACRO1
parte 1: MACRO1
parte 2:
parte 3:
Este ъltimo й a cereja do bolo, ele combina todos os outros macros e serб justamente o macro que chamaremos nas funзхes.
Mas por que os macros m@2 e m@1 "incluem" os outros? Cada macro tem que rodar em certa situaзгo (vocк verб abaixo), entгo precisamos ter certeza que nгo ocorra de dois ou mais executarem ao mesmo tempo. Й pra isso que serve "m@1:m@2:m@3" e "m@2:m@3".
Note que hб uma ordenaзгo "m@1:m@2:m@3", "m@2:m@3". Isso significa que o m@2 sу vai executar se m@3 nгo executar e que m@1 sу vai executar se m@2 e m@3 nгo executarem.
(Note que, por executar, eu digo serem "encontrados" pelo prй compilador)
O que falta agora й entender o que cada macro detecta, mas o @Dayvison_ jб explicou bem isso, entгo vou pular direto pro resultado do cуdigo.
Esse cуdigo:
PHP код:
main() {
new Foo[32] = { -5, ... };
new bar = MACRO1<Foo>[1];
new Float:foobar = Float:MACRO1<5>;
new fizzbar = MACRO1$15$;
printf("%d %f %d", bar, foobar, fizzbar);
}
Vai ser compilado para isso:
PHP код:
main() {
new Foo[32] = { -5, ... };
new bar = Foo[1];
new Float:foobar = Float:m@1:5;
new fizzbar = m@1:m@2:(15 + 15);
printf("%d %f %d", bar, foobar, fizzbar);
}
Vocк deve estar se pergutando por que "Float:m@1:5" e "m@1:m@2: (15+15)" sгo cуdigos vбlidos. Apresento-lhe as "weak tags" em PAWN.
Hб dois tipos de tags em PAWN, as "strongs" (fortes) e "weaks" (fracas). Strong tags sгo inicadas com letra maiъscula (e.g.: File:, Float: ) e weak tags sгo iniciadas com letra minъscula (e.g.: bool: ).
A diferenзa entre elas й que strong tags dгo warning no compilador se vocк passar um valor sem tag a elas, enquanto as weak tags aceitam esses valores em tag. Exemplo:
Dito isto, o cуdigo compila e roda de boa porque "m@1" e "m@1:m@2" sгo tags fracas.