elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Macros en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Macros en C  (Leído 3,257 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Macros en C
« en: 14 Febrero 2014, 18:06 pm »

Saludos, tengo una duda acerca de cómo se pueden usar unas MACROS en lenguaje C, es posible que el nombre de la MACRO tenga asignado mas de un valor?? por ejemplo:

NOMBRE '#','$','@'



En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Macros en C
« Respuesta #1 en: 14 Febrero 2014, 18:50 pm »

es posible que el nombre de la MACRO tenga asignado mas de un valor?? por ejemplo:

NOMBRE '#','$','@'
Las macros son sustituciones de texto, actúan de forma similar a la opción "remplazar" de un editor: donde aparezca el nombre de la macro (como una palabra separada de las demás e ignorando las cadenas literales) esta se sustituye por el texto de remplazamiento y si el resultado es valido depende de donde se realice la expansión.

Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NOMBRES  "Hugo", "Paco", "Luis"
  5.  
  6. int main(void)
  7. {
  8.   char nombre[][5] = {NOMBRES};
  9.  
  10.   printf("%s, %s, %s\n", nombre[0], nombre[1], nombre[2]);
  11.   printf("%s, %s, %s\n", NOMBRES);
  12.   printf("%s\n", (NOMBRES));
  13.  
  14.   return EXIT_SUCCESS;
  15. }
En las dos primeras ocurrencias de la macro la coma actúa como un separador mientras que en la ultima es un operador. Solo un ejemplo ilustrativo (utilidad practica: ninguna).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Macros en C
« Respuesta #2 en: 14 Febrero 2014, 21:07 pm »

Así mismo es m@o_614, el preprocesador de C sustituye cada aparición del identificador o nombre de la macro por el texto de reemplazo que haya sido definido. El texto final obtenido es pasado al compilador (obviamente para que lo compile, jeje).

Una aplicación puede ser si tienes un programa donde se define un valor que aparece muchas veces en el mismo. Si quieres cambiar ese parámetro, tendrías que editar manualmente sus apariciones. Por ejemplo, quieres leer un total de digamos 3 enteros dados por el usuario y formar un vector o arreglo con ellos y luego imprimir el valor de dichos elementos:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6. int i, x[3];
  7.  
  8. /* pedir numeros al usario */
  9. for ( i = 0; i < 3; i++ ) {
  10. printf( "Intro valor %d: ", i+1);
  11. scanf( "%d", &x[i] );
  12. getchar();
  13. }
  14.  
  15. /* imprimiendo contenido del arreglo */
  16. for ( i = 0; i < 3; i++ ) {
  17. printf( "Valor %d: %d\n", i+1, x[i] );
  18. }
  19.  
  20. return EXIT_SUCCESS;
  21. }

Observa que el valor "3" aparece tres veces en el código. Si quisieras modificar tu programa para que reciba no 3 sino 5 valores, tendrías que editar en dos líneas diferentes de dicho código. Una alternativa sería definir una constante simbólica N, e indicar que cada aparición suya debe reemplazarse por el valor 3:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N 3
  5.  
  6. int main(void)
  7. {
  8. int i, x[N];
  9.  
  10. /* pedir numeros al usario */
  11. for ( i = 0; i < N; i++ ) {
  12. printf( "Intro valor %d: ", i+1);
  13. scanf( "%d", &x[i] );
  14. getchar();
  15. }
  16.  
  17. /* imprimiendo contenido del arreglo */
  18. for ( i = 0; i < N; i++ ) {
  19. printf( "Valor %d: %d\n", i+1, x[i] );
  20. }
  21.  
  22. return EXIT_SUCCESS;
  23. }

Si quieres que el programa reciba 5 valores sólo debes cambiar una línea y poner #define N 5

Las instrucciones #define no van terminadas en punto y coma, puesto que no son instrucciones de asignación de valor a una variable, sino un reemplazo formal de texto en el código fuente.
« Última modificación: 14 Febrero 2014, 21:13 pm por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Macros en C
« Respuesta #3 en: 16 Febrero 2014, 18:44 pm »

Las instrucciones #define no van terminadas en punto y coma, puesto que no son instrucciones de asignación de valor a una variable, sino un reemplazo formal de texto en el código fuente.

Una corrección... los defines SI pueden terminar con punto y coma. Sobretodo si los defines se usan para concatenar instrucciones que se van a repetir mucho en el código... aunque eso ya es a gusto del programador.
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Macros en C
« Respuesta #4 en: 19 Febrero 2014, 03:35 am »

muchas gracias por sus respuestas una ultima duda, si yo tengo en un switch varios cases que van a realizar las mismas operaciones,por ejemplo:

Código
  1.  
  2. switch(car)
  3. {
  4.               case '1':
  5.               case '2':
  6.               case '3':
  7.               case '4':
  8.               case '5':
  9.               case '6':
  10.               case '7':
  11.               case '8':
  12.               case '9':
  13.               ........
  14.               ........
  15.               default:
  16.                  printf("Error");
  17.           }
  18.           break;

podria yo juntas los cases 1,2,3,4,5,6,7,8,9 en un solo case, llamado por ejemplo: IDM y que ese IDM fuera una macro que tuviera definida como

#define IDM if(car > 0 && car < 10) para asi poder ahorrarme lineas de codigo, puede una macro contener un condicional (un if en este caso)???

gracias
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Macros en C
« Respuesta #5 en: 19 Febrero 2014, 08:22 am »

muchas gracias por sus respuestas una ultima duda, si yo tengo en un switch varios cases que van a realizar las mismas operaciones,por ejemplo:

Código
  1.  
  2. switch(car)
  3. {
  4.               case '1':
  5.               case '2':
  6.               case '3':
  7.               case '4':
  8.               case '5':
  9.               case '6':
  10.               case '7':
  11.               case '8':
  12.               case '9':
  13.               ........
  14.               ........
  15.               default:
  16.                  printf("Error");
  17.           }
  18.           break;

podria yo juntas los cases 1,2,3,4,5,6,7,8,9 en un solo case, llamado por ejemplo: IDM y que ese IDM fuera una macro que tuviera definida como

#define IDM if(car > 0 && car < 10) para asi poder ahorrarme lineas de codigo, puede una macro contener un condicional (un if en este caso)???

gracias

Sinceramente deberías evitar el uso de macros más allá de lo estrictamente necesario.

Usar macros ofusca el código y lo vuelve, normalmente, más ilegible, ya que para comprender el código tienes que "explotar" tú manualmente las macros para intentar adivinar el código resultante.

Además el uso de macros dificulta las tareas de depuración.

En C yo limitaría el uso de macros a:

* Definir valores constantes para no tener que poner los valores "a pelo" en el código
* Para generar código multiplataforma
* Para nada más.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
macros ?????????
Programación Visual Basic
xato 1 1,642 Último mensaje 27 Diciembre 2006, 21:35 pm
por CeLaYa
If en macros ?
Programación C/C++
ramona98 7 3,244 Último mensaje 21 Agosto 2013, 09:39 am
por ramona98
macros en C
Programación C/C++
fafafa01 4 3,525 Último mensaje 25 Enero 2017, 18:43 pm
por MAFUS
macros « 1 2 »
Dudas Generales
debbiecarreno 13 8,609 Último mensaje 27 Mayo 2017, 09:50 am
por Lautaro Villarreal Culic'
Macros VBA
Foro Libre
busqueda 0 1,551 Último mensaje 24 Octubre 2017, 20:41 pm
por busqueda
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines