Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fafafa01 en 24 Enero 2017, 22:49 pm



Título: macros en C
Publicado por: fafafa01 en 24 Enero 2017, 22:49 pm
Buenas estaba tratando de analizar la siguiente macro:

Código
  1. #define swap(t,x,y) { t _z;  \
  2.                               _z=y; \
  3.                               y=x; \
  4.                               x=_z; }                  
  5.  

según el programa el parámetro t debe ser el nombre de un tipo (int, char o float)que sea del mismo tipo que los parametros x e y para así poder declarar la variable _z del mismo tipo.

mis dudas:
Para que sirve la barra '\' después del punto y coma.
la otra duda que tengo es si los parametros de swap pasan por valor como en cualquier funcion de c.
y la ultima duda, la macros reemplaza un texto de la forma
Código
  1. main(){
  2. swap(t,x,y);
  3. }
por todo lo qu esta adentro de las llaves {} incluyendo las llaves o las llaves no las reemplaza. si remplaza con las llaves no debería dar error.

Código
  1. main(){
  2. { t _z;  \
  3. _z=y; \
  4. y=x; \
  5. x=_z; }
  6. }


Título: Re: macros en C
Publicado por: MAFUS en 24 Enero 2017, 23:53 pm
En principio las macros solo se escriben en una única línea pero se usa la barra invertida para indicar al preprocesador que ésta continua en la linea siguiente.

Los datos de los parámetros se pasan literalmente: lo que tu escribas en el parámetro de llamada es lo mismo que va a usar la macro en su conversión.

Las llaves también aparecen en el código final cuando la macro se expande.

Las macros tienen el operado # y ## que convierte en cadena el parámetro y convierte en cadena dos parámetros y los une respectivamente. Se pueden hacer cosas muy interesantes con eso.

Para intercambiar dos valores, sin tener que usar una variable auxiliar puedes usar.
A ^= B;
B ^= A;
A ^= B;


Título: Re: macros en C
Publicado por: fafafa01 en 25 Enero 2017, 15:29 pm
Osea al final la macros quedaria asi:
Código
  1. Main(){
  2. { t _z;
  3. _z=y;
  4. y=x;
  5. x=_z; }
  6. }
  7.  

Con dos llaves


Título: Re: macros en C
Publicado por: engel lex en 25 Enero 2017, 15:37 pm
teoricamente

Código
  1. #define swap(t,x,y) { t _z;  \
  2.                               _z=y; \
  3.                               y=x; \
  4.                               x=_z; }                  
  5.  

Código
  1. main(){
  2. swap(int,a,b);
  3. }

queda

Código
  1. main(){
  2. {int _z; _z=b; b=a; a=_z;}
  3.  
  4. }

para que el _z no escape de ese scope


Título: Re: macros en C
Publicado por: MAFUS en 25 Enero 2017, 18:43 pm
Si tu compilador es gcc o g++ puedes ver el archivo generado, con las macros expandidas si compilas con la opción -E. Para verlo con tranquilidad lleva llévalo a un archivo:

Código:
gcc -E fuente.c > expandido.c
sinedo fuente.c el nombre de tu archivo fuente.