Macros, parбmetros - Duda
#1

estoy aprendiendo sobre esto de Pre-Processor, pero me he encontrado con algo que no comprendo.

Quote:
Originally Posted by ******
Some people like to put spaces after the comma in function parameter lists, like so:

Код:
#define MULTIPLY_TWO_NUMBERS(%0, %1)     %0 * %1
You CANNOT do this in macros - as mentioned before the FIRST space is the end of the search string, so this will look for "MULTIPLY_TWO_NUMBERS(%0,", not "MULTIPLY_TWO_NUMBERS(%0, %1)", and replace it with "%1) %0 * %1".

https://sampforum.blast.hk/showthread.php?tid=570933

їMe podrнan explicar lo que quiere decir sobre los ","?.
Reply
#2

Lo que dices es que si quieres un macro tipo "HOLA MUNDO" para que se reemplace por algo, no puedes dejar un espacio, pues el nombre del macro solo seria "HOLA" y por lo que se reemplaza seria "MUNDO".

En si lo que dice es que el nombre de un macro que crees termina apenas encuentre el primer espacio

pawn Код:
#define NOMBRE MACRO // Nombre del macro: NOMBRE... Reemplaza: MACRO
#define NOMBRE DEL MACRO // Nombre: NOMBRE... Reemplaza: DEL MACRO
#define NOMBRE_DEL MACRO // Nombre: NOMBRE_DEL... Reemplaza MACRO
----------
En el caso del ejemplo el nombre seria MULTIPLY_TWO_NUMBERS(%0, y reemplazarнa por %1) %0 * %1
Reply
#3

Ah vale gracias. Pero en si los parбmetros de un macro se separan con "," їNo?, tambiйn menciona algo sobre los parйntesis.

Gracias, lince.
Reply
#4

Si, los parametros se separan con una coma (,) pero en un macro no se deja un espacio luego de la coma.
Reply
#5

Vale, y ya esta ъltima duda a que se refiere con esto..

Quote:
Originally Posted by ******
Brackets

If the parameters are so flexible, how can you actually control what gets output? All the macros so far have been very bad - they didn't use brackets. Compare the following two macros:

Код:
// Without brackets (first).
#define MULTIPLY_TWO_A(%0,%1)           %0 * %1

// With brackets (second).
#define MULTIPLY_TWO_B(%0,%1)           ((%0) * (%1))

main()
{
    // Two with first.
    printf("%d", MULTIPLY_TWO_A(6, 7));
    
    // Two with second.
    printf("%d", MULTIPLY_TWO_B(6, 7));
    
    // Three with first.
    printf("%d", MULTIPLY_TWO_A(6, 7, 8));
    
    // Three with second.
    printf("%d", MULTIPLY_TWO_B(6, 7, 8));
}
Reply
#6

Los "macros" son simplemente formas de hacer entender al procesador que debe reemplazar coincidencias.

Osea:

pawn Код:
#define multiplicar(%0,%1) %0*%1
#define multiplicar2(%0,%1) (%0)*(%1)
#define multiplicar3(%0,%1) ((%0)*(%1))

printf("resultado1: %d", multiplicar(5, 5)); // Se reemplazarнa por "5*5" que es 25
printf("resultado2: %d", multiplicar2(5, 5)); // Se reemplazarнa por "(5)*(5)" que es 25
printf("resultado3: %d", multiplicar(5, 2, 5)); // Se reemplazarнa por "5*2*5" que es 50
printf("resultado4: %d", multiplicar2(5, 2, 5)); // Se reemplazarнa por "(5*2)*(5)" que es 50
printf("resultado5: %d", multiplicar3(5, 2)*4); // Se reemplazarнa por "((5)*(2))*2" que es 40
printf("resultado5: %d", multiplicar(5, 2)*2); // Se reemplazarнa por "5*2*2" que es 20
Todos esos resultados son "iguales" en cuanto a formula (osea, solo se ocupa multiplicaciуn), por eso no hay problemas. Pero si comienzas a aplicar sumas, restas, divisiones, entre otras, tendrбs problemas.
Si no entiendes a que me refiero te escrito los ejemplos mas explнcitos.
Reply
#7

En parte entiendo, lo que no pillo es la cuestiуn de los parйntesis.
Reply
#8

pawn Код:
#define macro(%0,%1,%2) %0 * %1 - %2
#define macro2(%0,%1,%2) (((%0) * %1) - %2)

public OnGameModeInit()
{
    printf("Resultado: %d", macro(2, 7, 12, 46)*9);
    printf("Resultado: %d", macro2(2, 7, 12, 46)*9);
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)