macros en C

Iniciado por fafafa01, 24 Enero 2017, 22:49 PM

0 Miembros y 1 Visitante están viendo este tema.

fafafa01

Buenas estaba tratando de analizar la siguiente macro:


#define swap(t,x,y) { t _z;  \
                              _z=y; \
                              y=x; \
                              x=_z; }                 


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
main(){
swap(t,x,y);
}

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.

main(){
{ t _z;  \
_z=y; \
y=x; \
x=_z; }
}

MAFUS

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;

fafafa01

Osea al final la macros quedaria asi:

Main(){
{ t _z;
_z=y;
y=x;
x=_z; }
}


Con dos llaves

engel lex

teoricamente

#define swap(t,x,y) { t _z;  \
                             _z=y; \
                             y=x; \
                             x=_z; }                  


main(){
swap(int,a,b);
}


queda

main(){
{int _z; _z=b; b=a; a=_z;}

}


para que el _z no escape de ese scope
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

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:

gcc -E fuente.c > expandido.c
sinedo fuente.c el nombre de tu archivo fuente.