[Ajuda] Mъltiplos Macros
#7

(@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"barfoobarfizzbar);

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"barfoobarfizzbar);

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:
PHP код:
// Exemplo da wiki https://sampwiki.blast.hk/wiki/Scripting...3.68743737
new
    
Strong:myStrong// Strong tag
    
weak:myWeak// weak tag
    
myNone// sem tag
 
myNone myStrong// Vai dar warning
myNone myWeak// NГO vai dar warning 
Dito isto, o cуdigo compila e roda de boa porque "m@1" e "m@1:m@2" sгo tags fracas.
Reply


Messages In This Thread
Mъltiplos Macros - by Injury - 15.12.2017, 16:09
Re: Mъltiplos Macros - by Marllun - 15.12.2017, 18:14
Re: Mъltiplos Macros - by Injury - 15.12.2017, 18:27
Re: Mъltiplos Macros - by Marllun - 15.12.2017, 18:36
Re: Mъltiplos Macros - by Injury - 15.12.2017, 18:42
Re: Mъltiplos Macros - by Dayvison_ - 15.12.2017, 19:38
Re: Mъltiplos Macros - by renatog - 15.12.2017, 19:57
Re: Mъltiplos Macros - by Injury - 15.12.2017, 20:00
Re: Mъltiplos Macros - by Dayvison_ - 15.12.2017, 22:45
Re: Mъltiplos Macros - by Injury - 16.12.2017, 10:48

Forum Jump:


Users browsing this thread: 1 Guest(s)